From 311ced5477cb56671def66be21aad2b7fe8a8b91 Mon Sep 17 00:00:00 2001 From: Dominus Vilicus Date: Sun, 20 Sep 2020 22:11:10 +0930 Subject: [PATCH] Revert "Revert "Update Changes"" --- .eslintignore | 1 - .eslintrc.js | 78 +- .github/ISSUE_TEMPLATE.md | 5 +- .github/ISSUE_TEMPLATE/feature_request.md | 5 + .github/PULL_REQUEST_TEMPLATE.md | 11 +- .github/workflows/ci.yml | 9 +- CHANGELOG.md | 65 +- CONTRIBUTING.md | 5 +- README.md | 23 +- package-lock.json | 1293 +++++++++++++---- package.json | 17 +- rollup.config.js | 20 +- site/README.md | 44 +- ...-11-26-frameworks-without-the-framework.md | 2 +- ...per-towards-the-ideal-web-app-framework.md | 8 +- .../2019-04-16-svelte-for-new-developers.md | 4 +- .../blog/2020-07-17-svelte-and-typescript.md | 141 ++ site/content/docs/02-template-syntax.md | 31 +- site/content/docs/03-run-time.md | 8 +- .../05-bindings/05-file-inputs/App.svelte | 37 + .../05-bindings/05-file-inputs/meta.json | 3 + .../App.svelte | 0 .../meta.json | 0 .../App.svelte | 0 .../meta.json | 0 .../App.svelte | 9 +- .../meta.json | 0 .../App.svelte | 4 +- .../meta.json | 0 .../App.svelte | 0 .../meta.json | 0 .../{10-bind-this => 11-bind-this}/App.svelte | 2 +- .../{10-bind-this => 11-bind-this}/meta.json | 0 .../App.svelte | 0 .../Keypad.svelte | 0 .../meta.json | 0 site/content/faq/100-im-new-to-svelte.md | 2 +- .../faq/200-are-there-any-video-courses.md | 6 +- site/content/faq/300-is-svelte-dev-down.md | 5 - .../400-how-can-i-get-syntax-highlighting.md | 4 +- .../450-how-do-i-document-my-components.md | 32 + .../faq/500-what-about-typescript-support.md | 19 +- .../01-svelte-self/text.md | 4 +- site/package-lock.json | 602 ++++---- site/package.json | 30 +- site/rollup.config.js | 25 +- site/scripts/copy-workers.js | 4 + .../components/Repl/InputOutputToggle.svelte | 2 +- site/src/components/Repl/ReplWidget.svelte | 3 + site/src/routes/_layout.svelte | 1 + site/src/routes/blog/[slug].svelte | 9 + site/src/routes/blog/rss.xml.js | 16 +- site/src/routes/docs/_sections.js | 2 +- .../[id]/_components/AppControls/index.svelte | 2 + site/src/routes/repl/[id]/index.svelte | 5 +- site/src/routes/repl/embed.svelte | 2 + .../tutorial/[slug]/_TableOfContents.svelte | 4 +- site/src/utils/highlight.js | 1 + .../examples/thumbnails/file-inputs.jpg | Bin 0 -> 2751 bytes site/static/media/svelte-ts.png | Bin 0 -> 189664 bytes src/compiler/compile/Component.ts | 97 +- src/compiler/compile/css/Stylesheet.ts | 2 +- src/compiler/compile/index.ts | 4 +- src/compiler/compile/nodes/Binding.ts | 9 +- src/compiler/compile/nodes/EachBlock.ts | 1 + src/compiler/compile/nodes/Element.ts | 48 +- src/compiler/compile/nodes/Text.ts | 2 +- src/compiler/compile/nodes/shared/Context.ts | 8 +- .../compile/nodes/shared/Expression.ts | 52 +- src/compiler/compile/render_dom/Block.ts | 50 +- src/compiler/compile/render_dom/Renderer.ts | 31 +- src/compiler/compile/render_dom/index.ts | 38 +- .../compile/render_dom/wrappers/AwaitBlock.ts | 14 +- .../compile/render_dom/wrappers/EachBlock.ts | 31 +- .../render_dom/wrappers/Element/Attribute.ts | 234 +-- .../render_dom/wrappers/Element/Binding.ts | 149 +- .../wrappers/Element/SpreadAttribute.ts | 3 + .../Element/handle_select_value_binding.ts | 16 + .../render_dom/wrappers/Element/index.ts | 305 ++-- .../compile/render_dom/wrappers/IfBlock.ts | 2 +- .../wrappers/InlineComponent/index.ts | 25 +- .../render_dom/wrappers/RawMustacheTag.ts | 8 +- .../compile/render_dom/wrappers/Slot.ts | 28 +- .../compile/render_dom/wrappers/Window.ts | 4 +- .../render_dom/wrappers/shared/bind_this.ts | 84 +- .../wrappers/shared/get_slot_definition.ts | 4 +- .../shared/mark_each_block_bindings.ts | 26 + .../compile/render_ssr/handlers/Slot.ts | 4 +- src/compiler/compile/render_ssr/index.ts | 45 +- src/compiler/compile/utils/compare_node.ts | 19 + .../compile/utils/flatten_reference.ts | 21 +- src/compiler/compile/utils/hash.ts | 1 + src/compiler/compile/utils/replace_object.ts | 14 + .../compile/utils/reserved_keywords.ts | 2 +- .../utils/string_to_member_expression.ts | 17 + src/compiler/compile/utils/stringify.ts | 2 +- src/compiler/interfaces.ts | 4 +- src/compiler/parse/index.ts | 9 +- src/compiler/parse/read/script.ts | 2 +- src/compiler/parse/read/style.ts | 11 +- src/compiler/parse/state/mustache.ts | 16 +- src/compiler/parse/state/tag.ts | 35 +- src/compiler/parse/state/text.ts | 2 +- src/compiler/parse/utils/entities.ts | 2 +- src/compiler/parse/utils/html.ts | 6 +- src/compiler/preprocess/index.ts | 10 +- src/compiler/utils/fuzzymatch.ts | 4 +- src/compiler/utils/names.ts | 2 +- src/compiler/utils/namespaces.ts | 2 +- src/runtime/animate/index.ts | 6 +- src/runtime/internal/Component.ts | 27 +- src/runtime/internal/await_block.ts | 3 + src/runtime/internal/dev.ts | 2 +- src/runtime/internal/dom.ts | 54 +- src/runtime/internal/keyed_each.ts | 2 +- src/runtime/internal/lifecycle.ts | 10 +- src/runtime/internal/utils.ts | 12 + src/runtime/motion/tweened.ts | 10 +- src/runtime/store/index.ts | 4 +- src/runtime/transition/index.ts | 56 +- test/css/index.js | 3 +- test/css/samples/empty-class/_config.js | 2 +- .../global-with-unused-descendant/_config.js | 2 +- .../expected.html | 4 +- .../input.svelte | 6 +- .../_config.js | 2 +- .../unused-selector-leading/_config.js | 4 +- .../unused-selector-string-concat/_config.js | 44 +- .../unused-selector-ternary-bailed/_config.js | 2 +- .../unused-selector-ternary-concat/_config.js | 12 +- .../unused-selector-ternary-nested/_config.js | 12 +- .../unused-selector-ternary/_config.js | 2 +- test/css/samples/unused-selector/_config.js | 2 +- test/custom-elements/index.js | 15 +- test/helpers.js | 1 + .../samples/dynamic-text-nil/_config.js | 4 +- test/hydration/samples/element-ref/_config.js | 2 +- test/js/index.js | 6 +- .../action-custom-event-handler/expected.js | 13 +- test/js/samples/action/expected.js | 11 +- test/js/samples/bind-online/expected.js | 18 +- test/js/samples/bind-open/expected.js | 17 +- test/js/samples/bind-width-height/expected.js | 2 +- .../bindings-readonly-order/expected.js | 19 +- .../capture-inject-dev-only/expected.js | 11 +- .../samples/capture-inject-state/expected.js | 7 +- .../expected.js | 2 +- .../component-static-array/expected.js | 3 +- .../component-static-immutable/expected.js | 3 +- .../component-static-immutable2/expected.js | 3 +- .../samples/component-static-var/expected.js | 17 +- test/js/samples/component-static/expected.js | 3 +- .../expected.js | 11 +- .../samples/computed-collapsed-if/expected.js | 2 +- test/js/samples/data-attribute/expected.js | 2 +- test/js/samples/debug-empty/expected.js | 7 +- .../debug-foo-bar-baz-things/expected.js | 7 +- test/js/samples/debug-foo/expected.js | 7 +- test/js/samples/debug-hoisted/expected.js | 4 +- .../samples/debug-no-dependencies/expected.js | 4 +- test/js/samples/debug-ssr-foo/expected.js | 2 +- .../samples/deconflict-builtins/expected.js | 2 +- .../js/samples/deconflict-globals/expected.js | 2 +- .../expected.js | 7 +- .../samples/dont-invalidate-this/expected.js | 11 +- test/js/samples/dynamic-import/expected.js | 3 +- .../each-block-array-literal/expected.js | 2 +- .../each-block-changed-check/expected.js | 6 +- .../each-block-keyed-animated/expected.js | 2 +- test/js/samples/each-block-keyed/expected.js | 2 +- .../samples/event-handler-dynamic/expected.js | 23 +- .../event-handler-no-passive/expected.js | 11 +- test/js/samples/event-modifiers/expected.js | 21 +- .../js/samples/if-block-no-update/expected.js | 2 +- test/js/samples/if-block-simple/expected.js | 2 +- test/js/samples/initial-context/expected.js | 59 + test/js/samples/initial-context/input.svelte | 7 + .../expected.js | 2 +- .../inline-style-optimized-url/expected.js | 2 +- .../inline-style-optimized/expected.js | 2 +- .../inline-style-unoptimized/expected.js | 2 +- test/js/samples/input-files/expected.js | 13 +- .../input-no-initial-value/expected.js | 17 +- test/js/samples/input-range/expected.js | 19 +- test/js/samples/input-value/expected.js | 11 +- .../input-without-blowback-guard/expected.js | 13 +- .../expected.js | 11 +- .../expected.js | 11 +- .../expected.js | 11 +- .../expected.js | 11 +- test/js/samples/loop-protect/_config.js | 4 +- test/js/samples/loop-protect/expected.js | 8 +- test/js/samples/media-bindings/expected.js | 38 +- .../non-imported-component/expected.js | 6 +- test/js/samples/optional-chaining/expected.js | 189 +++ .../js/samples/optional-chaining/input.svelte | 31 + .../expected.js | 2 +- .../expected.js | 2 +- .../samples/select-dynamic-value/expected.js | 28 +- .../samples/src-attribute-check/expected.js | 2 +- .../samples/ssr-no-oncreate-etc/expected.js | 2 +- .../samples/ssr-preserve-comments/expected.js | 2 +- test/js/samples/title/expected.js | 2 +- test/js/samples/transition-local/expected.js | 2 +- .../transition-repeated-outro/expected.js | 2 +- .../use-elements-as-anchors/expected.js | 2 +- test/js/samples/video-bindings/expected.js | 19 +- .../samples/window-binding-online/expected.js | 18 +- .../samples/window-binding-scroll/expected.js | 23 +- test/parser/index.js | 10 +- .../samples/action-with-call/output.json | 3 +- test/parser/samples/animation/output.json | 6 +- test/parser/samples/await-catch/output.json | 9 +- .../samples/await-then-catch/output.json | 15 +- .../parser/samples/dynamic-import/output.json | 18 +- .../samples/each-block-else/output.json | 6 +- .../samples/each-block-indexed/output.json | 6 +- .../samples/each-block-keyed/output.json | 9 +- test/parser/samples/each-block/output.json | 6 +- .../error.json | 10 + .../input.svelte | 3 + .../error.json | 10 + .../input.svelte | 5 + .../error.json | 10 + .../input.svelte | 3 + .../no-error-if-before-closing/output.json | 12 +- .../samples/unusual-identifier/output.json | 6 +- test/preprocess/samples/comments/_config.js | 6 +- .../samples/script-self-closing/_config.js | 12 + .../samples/script-self-closing/input.svelte | 1 + .../samples/script-self-closing/output.svelte | 1 + .../samples/style-self-closing/_config.js | 12 + .../samples/style-self-closing/input.svelte | 3 + .../samples/style-self-closing/output.svelte | 3 + test/runtime/index.js | 4 +- .../samples/$$rest-without-props/_config.js | 2 +- test/runtime/samples/$$rest/_config.js | 2 +- test/runtime/samples/$$slot/A.svelte | 31 + test/runtime/samples/$$slot/_config.js | 18 + test/runtime/samples/$$slot/main.svelte | 23 + .../_config.js | 2 +- .../action-ternary-template/_config.js | 4 +- test/runtime/samples/action-this/_config.js | 2 +- .../apply-directives-in-order-2/_config.js | 6 +- .../apply-directives-in-order/_config.js | 2 +- .../attribute-boolean-false/_config.js | 2 +- .../samples/attribute-boolean-true/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../samples/attribute-false/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../runtime/samples/attribute-null/_config.js | 2 +- .../attribute-prefer-expression/_config.js | 4 +- .../samples/attribute-undefined/_config.js | 2 +- .../await-with-update-2/Component.svelte | 7 + .../samples/await-with-update-2/_config.js | 64 + .../samples/await-with-update-2/main.svelte | 16 + .../await-with-update/Component.svelte | 5 + .../samples/await-with-update/_config.js | 60 + .../samples/await-with-update/main.svelte | 16 + .../samples/await-without-catch/_config.js | 44 + .../samples/await-without-catch/main.svelte | 9 + .../_config.js | 2 +- .../binding-contenteditable-html/_config.js | 4 +- .../_config.js | 2 +- .../binding-contenteditable-text/_config.js | 4 +- .../_config.js | 4 +- .../_config.js | 10 +- .../_config.js | 81 ++ .../main.svelte | 19 + .../binding-input-group-each-1/_config.js | 275 ++++ .../binding-input-group-each-1/main.svelte | 15 + .../binding-input-group-each-2/_config.js | 59 + .../binding-input-group-each-2/main.svelte | 17 + .../binding-input-group-each-3/_config.js | 275 ++++ .../binding-input-group-each-3/main.svelte | 15 + .../binding-input-group-each-4/_config.js | 153 ++ .../binding-input-group-each-4/main.svelte | 33 + .../binding-input-group-each-5/_config.js | 160 ++ .../binding-input-group-each-5/main.svelte | 24 + .../binding-input-group-each-6/_config.js | 87 ++ .../binding-input-group-each-6/main.svelte | 22 + .../samples/binding-input-number-2/_config.js | 2 +- .../samples/binding-input-number/_config.js | 4 +- .../_config.js | 2 +- .../binding-input-range-change/_config.js | 4 +- .../samples/binding-input-range/_config.js | 4 +- .../_config.js | 4 +- .../_config.js | 2 +- .../binding-input-text-contextual/_config.js | 4 +- .../_config.js | 6 +- .../_config.js | 6 +- .../_config.js | 6 +- .../_config.js | 8 +- .../_config.js | 6 +- .../binding-input-text-deep/_config.js | 6 +- .../binding-input-text-undefined/_config.js | 2 +- .../samples/binding-input-text/_config.js | 4 +- .../binding-select-initial-value/_config.js | 4 +- .../samples/binding-select-late-2/_config.js | 34 + .../samples/binding-select-late-2/main.svelte | 12 + .../samples/binding-select-late-3/_config.js | 34 + .../samples/binding-select-late-3/main.svelte | 12 + .../binding-select-optgroup/_config.js | 2 +- .../runtime/samples/binding-select/_config.js | 4 +- .../samples/binding-store-deep/_config.js | 2 +- test/runtime/samples/binding-store/_config.js | 2 +- .../samples/binding-textarea/_config.js | 4 +- .../_config.js | 53 + .../main.svelte | 17 + .../samples/bitmask-overflow-2/_config.js | 2 +- .../samples/bitmask-overflow-3/_config.js | 2 +- .../bitmask-overflow-slot-2/_config.js | 2 +- .../class-with-spread-and-bind/_config.js | 4 +- .../samples/component-binding-deep/_config.js | 2 +- .../component-binding-store/Input.svelte | 5 + .../component-binding-store/_config.js | 61 + .../component-binding-store/main.svelte | 18 + .../_config.js | 15 + .../main.svelte | 6 + .../component-event-not-stale/_config.js | 4 +- .../component-events-console/_config.js | 2 +- .../component-namespace/Tooltip.svelte | 1 + .../samples/component-namespace/Widget.svelte | 5 + .../samples/component-namespace/_config.js | 3 + .../samples/component-namespace/main.svelte | 8 + .../component-shorthand-import/_config.js | 2 +- .../component-slot-fallback-3/_config.js | 2 +- .../component-slot-fallback-4/_config.js | 2 +- .../component-slot-let-in-slot/_config.js | 2 +- .../component-slot-nested-if/_config.js | 2 +- .../samples/deconflict-builtins-2/_config.js | 2 +- .../dev-warning-missing-data-each/_config.js | 12 +- .../runtime/samples/document-event/_config.js | 2 +- .../each-block-array-literal/_config.js | 2 +- .../_config.js | 2 +- .../each-block-destructured-array/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 4 +- .../_config.js | 2 +- .../each-block-destructured-object/_config.js | 2 +- .../each-block-else-mount-or-intro/_config.js | 2 +- .../samples/each-block-in-if-block/_config.js | 2 +- .../Component.svelte | 5 + .../_config.js | 21 + .../main.svelte | 17 + .../samples/each-block-keyed-empty/_config.js | 2 +- .../each-block-keyed-non-prop/_config.js | 2 +- .../_config.js | 2 +- .../samples/each-block-keyed-shift/_config.js | 2 +- .../each-block-keyed-siblings/_config.js | 4 +- .../each-block-keyed-static/_config.js | 2 +- .../each-block-scope-shadow-bind-2/_config.js | 23 + .../main.svelte | 10 + .../each-block-scope-shadow-bind-3/_config.js | 105 ++ .../main.svelte | 14 + .../each-block-scope-shadow-bind-4/_config.js | 64 + .../main.svelte | 14 + .../each-block-scope-shadow-bind/_config.js | 23 + .../each-block-scope-shadow-bind/main.svelte | 10 + .../each-block-scope-shadow-self/_config.js | 2 +- .../each-blocks-assignment-2/_config.js | 20 + .../each-blocks-assignment-2/main.svelte | 12 + .../samples/each-blocks-assignment/_config.js | 97 ++ .../each-blocks-assignment/main.svelte | 13 + test/runtime/samples/empty-dom/_config.js | 2 +- .../samples/empty-style-block/_config.js | 2 +- .../escape-template-literals/_config.js | 2 +- .../samples/event-handler-async/_config.js | 2 +- .../event-handler-dynamic-2/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../event-handler-dynamic-hash/_config.js | 2 +- .../event-handler-dynamic-invalid/_config.js | 2 +- .../_config.js | 2 +- .../samples/event-handler-dynamic/_config.js | 2 +- .../event-handler-each-this/_config.js | 2 +- .../event-handler-modifier-self/_config.js | 2 +- .../_config.js | 12 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 4 +- .../samples/if-block-else-in-each/_config.js | 4 +- .../if-block-else-partial-outro/_config.js | 4 +- .../_config.js | 2 +- .../_config.js | 2 +- .../samples/initial-state-assign/_config.js | 2 +- .../innerhtml-with-comments/_config.js | 8 + .../innerhtml-with-comments/main.svelte | 5 + .../_config.js | 6 +- .../loop-protect-generator-opt-out/_config.js | 4 +- .../loop-protect-inner-function/_config.js | 2 +- test/runtime/samples/loop-protect/_config.js | 2 +- .../nested-transition-detach-each/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../samples/noscript-removal/_config.js | 2 +- .../paren-wrapped-expressions/_config.js | 2 +- test/runtime/samples/prop-exports/_config.js | 2 +- .../Comp.svelte | 6 + .../_config.js | 30 + .../main.svelte | 8 + .../samples/props-reactive-slot/Comp.svelte | 1 + .../samples/props-reactive-slot/_config.js | 21 + .../samples/props-reactive-slot/main.svelte | 13 + .../raw-mustache-as-root/RawMustache.svelte | 5 + .../samples/raw-mustache-as-root/_config.js | 33 + .../samples/raw-mustache-as-root/main.svelte | 17 + .../raw-mustache-inside-head/_config.js | 16 + .../raw-mustache-inside-head/main.svelte | 16 + .../raw-mustache-inside-slot/Component.svelte | 2 + .../raw-mustache-inside-slot/_config.js | 33 + .../raw-mustache-inside-slot/main.svelte | 17 + .../samples/raw-mustaches-td-tr/_config.js | 18 + .../samples/raw-mustaches-td-tr/main.svelte | 12 + .../_config.js | 27 + .../main.svelte | 10 + .../reactive-import-statement/_config.js | 2 +- .../reactive-value-assign-property/_config.js | 5 + .../main.svelte | 6 + .../self-reference-component/_config.js | 2 +- .../samples/set-undefined-attr/_config.js | 2 +- .../samples/sigil-component-prop/_config.js | 2 +- .../slot-if-block-update-no-anchor/_config.js | 2 +- .../samples/spread-component-2/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 8 +- .../spread-component-dynamic/_config.js | 8 +- .../_config.js | 2 +- .../samples/spread-each-component/_config.js | 2 +- .../samples/spread-each-element/_config.js | 2 +- .../samples/spread-element-boolean/_config.js | 2 +- .../_config.js | 39 + .../main.svelte | 12 + .../_config.js | 12 + .../main.svelte | 5 + .../InputOne.svelte | 18 + .../InputTwo.svelte | 19 + .../spread-element-input-value/_config.js | 62 + .../spread-element-input-value/main.svelte | 9 + .../spread-element-input-value/utils.js | 6 + .../_config.js | 2 +- .../spread-element-multiple/_config.js | 8 +- .../_config.js | 2 +- .../store-each-binding-deep/_config.js | 14 + .../store-each-binding-deep/main.svelte | 11 + .../samples/store-imports-hoisted/_config.js | 7 + .../samples/store-imports-hoisted/foo.js | 3 + .../samples/store-imports-hoisted/main.svelte | 7 + .../samples/store-resubscribe-b/_config.js | 2 +- .../store-resubscribe-export/_config.js | 8 +- .../store-resubscribe-observable/_config.js | 2 +- .../samples/store-shadow-scope/_config.js | 3 + .../samples/store-shadow-scope/main.svelte | 9 + .../_config.js | 3 + .../main.svelte | 9 + .../svg-tspan-preserve-space/_config.js | 2 +- .../this-in-function-expressions/_config.js | 10 + .../this-in-function-expressions/main.svelte | 2 + .../_config.js | 2 +- .../transition-css-duration/_config.js | 2 +- .../samples/transition-css-iframe/_config.js | 2 +- .../transition-css-in-out-in/_config.js | 2 +- .../_config.js | 2 +- .../transition-js-aborted-outro/_config.js | 4 +- .../transition-js-deferred-b/_config.js | 2 +- .../samples/transition-js-deferred/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 54 + .../main.svelte | 27 + .../_config.js | 22 + .../main.svelte | 18 + .../_config.js | 20 + .../main.svelte | 18 + .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../transition-js-local-and-global/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../transition-js-local-nested-if/_config.js | 2 +- .../samples/transition-js-local/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../transition-js-nested-each/_config.js | 2 +- .../transition-js-nested-if/_config.js | 2 +- .../_config.js | 2 +- .../transition-js-parameterised/_config.js | 2 +- .../unchanged-expression-escape/_config.js | 2 +- .../unchanged-expression-xss/_config.js | 2 +- .../samples/whitespace-list/_config.js | 2 +- .../window-bind-scroll-update/_config.js | 2 +- .../window-binding-scroll-store/_config.js | 10 +- .../samples/window-event-custom/_config.js | 2 +- test/server-side-rendering/index.js | 4 +- test/validator/index.js | 2 +- .../errors.json | 17 + .../input.svelte | 6 + .../input.svelte | 6 + .../warnings.json | 32 + .../a11y-media-has-caption/input.svelte | 4 + .../a11y-media-has-caption/warnings.json | 32 + test/vars/samples/assumed-global/_config.js | 2 +- .../vars/samples/duplicate-globals/_config.js | 2 +- .../duplicate-non-hoistable/_config.js | 2 +- test/vars/samples/duplicate-vars/_config.js | 2 +- .../vars/samples/implicit-reactive/_config.js | 2 +- .../samples/referenced-from-script/_config.js | 32 +- .../samples/template-references/_config.js | 10 +- test/vars/samples/undeclared/_config.js | 2 +- 517 files changed, 7064 insertions(+), 2001 deletions(-) create mode 100644 site/content/blog/2020-07-17-svelte-and-typescript.md create mode 100644 site/content/examples/05-bindings/05-file-inputs/App.svelte create mode 100644 site/content/examples/05-bindings/05-file-inputs/meta.json rename site/content/examples/05-bindings/{05-select-bindings => 06-select-bindings}/App.svelte (100%) rename site/content/examples/05-bindings/{05-select-bindings => 06-select-bindings}/meta.json (100%) rename site/content/examples/05-bindings/{06-multiple-select-bindings => 07-multiple-select-bindings}/App.svelte (100%) rename site/content/examples/05-bindings/{06-multiple-select-bindings => 07-multiple-select-bindings}/meta.json (100%) rename site/content/examples/05-bindings/{07-each-block-bindings => 08-each-block-bindings}/App.svelte (89%) rename site/content/examples/05-bindings/{07-each-block-bindings => 08-each-block-bindings}/meta.json (100%) rename site/content/examples/05-bindings/{08-media-elements => 09-media-elements}/App.svelte (95%) rename site/content/examples/05-bindings/{08-media-elements => 09-media-elements}/meta.json (100%) rename site/content/examples/05-bindings/{09-dimensions => 10-dimensions}/App.svelte (100%) rename site/content/examples/05-bindings/{09-dimensions => 10-dimensions}/meta.json (100%) rename site/content/examples/05-bindings/{10-bind-this => 11-bind-this}/App.svelte (99%) rename site/content/examples/05-bindings/{10-bind-this => 11-bind-this}/meta.json (100%) rename site/content/examples/05-bindings/{11-component-bindings => 12-component-bindings}/App.svelte (100%) rename site/content/examples/05-bindings/{11-component-bindings => 12-component-bindings}/Keypad.svelte (100%) rename site/content/examples/05-bindings/{11-component-bindings => 12-component-bindings}/meta.json (100%) delete mode 100644 site/content/faq/300-is-svelte-dev-down.md create mode 100644 site/content/faq/450-how-do-i-document-my-components.md create mode 100644 site/scripts/copy-workers.js create mode 100644 site/static/examples/thumbnails/file-inputs.jpg create mode 100644 site/static/media/svelte-ts.png create mode 100644 src/compiler/compile/render_dom/wrappers/Element/SpreadAttribute.ts create mode 100644 src/compiler/compile/render_dom/wrappers/Element/handle_select_value_binding.ts create mode 100644 src/compiler/compile/render_dom/wrappers/shared/mark_each_block_bindings.ts create mode 100644 src/compiler/compile/utils/compare_node.ts create mode 100644 src/compiler/compile/utils/replace_object.ts create mode 100644 src/compiler/compile/utils/string_to_member_expression.ts create mode 100644 test/js/samples/initial-context/expected.js create mode 100644 test/js/samples/initial-context/input.svelte create mode 100644 test/js/samples/optional-chaining/expected.js create mode 100644 test/js/samples/optional-chaining/input.svelte create mode 100644 test/parser/samples/error-css-global-without-selector/error.json create mode 100644 test/parser/samples/error-css-global-without-selector/input.svelte create mode 100644 test/parser/samples/error-unmatched-closing-tag-autoclose-2/error.json create mode 100644 test/parser/samples/error-unmatched-closing-tag-autoclose-2/input.svelte create mode 100644 test/parser/samples/error-unmatched-closing-tag-autoclose/error.json create mode 100644 test/parser/samples/error-unmatched-closing-tag-autoclose/input.svelte create mode 100644 test/preprocess/samples/script-self-closing/_config.js create mode 100644 test/preprocess/samples/script-self-closing/input.svelte create mode 100644 test/preprocess/samples/script-self-closing/output.svelte create mode 100644 test/preprocess/samples/style-self-closing/_config.js create mode 100644 test/preprocess/samples/style-self-closing/input.svelte create mode 100644 test/preprocess/samples/style-self-closing/output.svelte create mode 100644 test/runtime/samples/$$slot/A.svelte create mode 100644 test/runtime/samples/$$slot/_config.js create mode 100644 test/runtime/samples/$$slot/main.svelte create mode 100644 test/runtime/samples/await-with-update-2/Component.svelte create mode 100644 test/runtime/samples/await-with-update-2/_config.js create mode 100644 test/runtime/samples/await-with-update-2/main.svelte create mode 100644 test/runtime/samples/await-with-update/Component.svelte create mode 100644 test/runtime/samples/await-with-update/_config.js create mode 100644 test/runtime/samples/await-with-update/main.svelte create mode 100644 test/runtime/samples/await-without-catch/_config.js create mode 100644 test/runtime/samples/await-without-catch/main.svelte create mode 100644 test/runtime/samples/binding-input-group-duplicate-value/_config.js create mode 100644 test/runtime/samples/binding-input-group-duplicate-value/main.svelte create mode 100644 test/runtime/samples/binding-input-group-each-1/_config.js create mode 100644 test/runtime/samples/binding-input-group-each-1/main.svelte create mode 100644 test/runtime/samples/binding-input-group-each-2/_config.js create mode 100644 test/runtime/samples/binding-input-group-each-2/main.svelte create mode 100644 test/runtime/samples/binding-input-group-each-3/_config.js create mode 100644 test/runtime/samples/binding-input-group-each-3/main.svelte create mode 100644 test/runtime/samples/binding-input-group-each-4/_config.js create mode 100644 test/runtime/samples/binding-input-group-each-4/main.svelte create mode 100644 test/runtime/samples/binding-input-group-each-5/_config.js create mode 100644 test/runtime/samples/binding-input-group-each-5/main.svelte create mode 100644 test/runtime/samples/binding-input-group-each-6/_config.js create mode 100644 test/runtime/samples/binding-input-group-each-6/main.svelte create mode 100644 test/runtime/samples/binding-select-late-2/_config.js create mode 100644 test/runtime/samples/binding-select-late-2/main.svelte create mode 100644 test/runtime/samples/binding-select-late-3/_config.js create mode 100644 test/runtime/samples/binding-select-late-3/main.svelte create mode 100644 test/runtime/samples/binding-this-each-block-property-2/_config.js create mode 100644 test/runtime/samples/binding-this-each-block-property-2/main.svelte create mode 100644 test/runtime/samples/component-binding-store/Input.svelte create mode 100644 test/runtime/samples/component-binding-store/_config.js create mode 100644 test/runtime/samples/component-binding-store/main.svelte create mode 100644 test/runtime/samples/component-event-handler-contenteditable/_config.js create mode 100644 test/runtime/samples/component-event-handler-contenteditable/main.svelte create mode 100644 test/runtime/samples/component-namespace/Tooltip.svelte create mode 100644 test/runtime/samples/component-namespace/Widget.svelte create mode 100644 test/runtime/samples/component-namespace/_config.js create mode 100644 test/runtime/samples/component-namespace/main.svelte create mode 100644 test/runtime/samples/each-block-keyed-component-action/Component.svelte create mode 100644 test/runtime/samples/each-block-keyed-component-action/_config.js create mode 100644 test/runtime/samples/each-block-keyed-component-action/main.svelte create mode 100644 test/runtime/samples/each-block-scope-shadow-bind-2/_config.js create mode 100644 test/runtime/samples/each-block-scope-shadow-bind-2/main.svelte create mode 100644 test/runtime/samples/each-block-scope-shadow-bind-3/_config.js create mode 100644 test/runtime/samples/each-block-scope-shadow-bind-3/main.svelte create mode 100644 test/runtime/samples/each-block-scope-shadow-bind-4/_config.js create mode 100644 test/runtime/samples/each-block-scope-shadow-bind-4/main.svelte create mode 100644 test/runtime/samples/each-block-scope-shadow-bind/_config.js create mode 100644 test/runtime/samples/each-block-scope-shadow-bind/main.svelte create mode 100644 test/runtime/samples/each-blocks-assignment-2/_config.js create mode 100644 test/runtime/samples/each-blocks-assignment-2/main.svelte create mode 100644 test/runtime/samples/each-blocks-assignment/_config.js create mode 100644 test/runtime/samples/each-blocks-assignment/main.svelte create mode 100644 test/runtime/samples/innerhtml-with-comments/_config.js create mode 100644 test/runtime/samples/innerhtml-with-comments/main.svelte create mode 100644 test/runtime/samples/props-reactive-only-with-change/Comp.svelte create mode 100644 test/runtime/samples/props-reactive-only-with-change/_config.js create mode 100644 test/runtime/samples/props-reactive-only-with-change/main.svelte create mode 100644 test/runtime/samples/props-reactive-slot/Comp.svelte create mode 100644 test/runtime/samples/props-reactive-slot/_config.js create mode 100644 test/runtime/samples/props-reactive-slot/main.svelte create mode 100644 test/runtime/samples/raw-mustache-as-root/RawMustache.svelte create mode 100644 test/runtime/samples/raw-mustache-as-root/_config.js create mode 100644 test/runtime/samples/raw-mustache-as-root/main.svelte create mode 100644 test/runtime/samples/raw-mustache-inside-head/_config.js create mode 100644 test/runtime/samples/raw-mustache-inside-head/main.svelte create mode 100644 test/runtime/samples/raw-mustache-inside-slot/Component.svelte create mode 100644 test/runtime/samples/raw-mustache-inside-slot/_config.js create mode 100644 test/runtime/samples/raw-mustache-inside-slot/main.svelte create mode 100644 test/runtime/samples/raw-mustaches-td-tr/_config.js create mode 100644 test/runtime/samples/raw-mustaches-td-tr/main.svelte create mode 100644 test/runtime/samples/reactive-function-called-reassigned/_config.js create mode 100644 test/runtime/samples/reactive-function-called-reassigned/main.svelte create mode 100644 test/runtime/samples/reactive-value-assign-property/_config.js create mode 100644 test/runtime/samples/reactive-value-assign-property/main.svelte create mode 100644 test/runtime/samples/spread-element-input-select-multiple/_config.js create mode 100644 test/runtime/samples/spread-element-input-select-multiple/main.svelte create mode 100644 test/runtime/samples/spread-element-input-value-undefined/_config.js create mode 100644 test/runtime/samples/spread-element-input-value-undefined/main.svelte create mode 100644 test/runtime/samples/spread-element-input-value/InputOne.svelte create mode 100644 test/runtime/samples/spread-element-input-value/InputTwo.svelte create mode 100644 test/runtime/samples/spread-element-input-value/_config.js create mode 100644 test/runtime/samples/spread-element-input-value/main.svelte create mode 100644 test/runtime/samples/spread-element-input-value/utils.js create mode 100644 test/runtime/samples/store-each-binding-deep/_config.js create mode 100644 test/runtime/samples/store-each-binding-deep/main.svelte create mode 100644 test/runtime/samples/store-imports-hoisted/_config.js create mode 100644 test/runtime/samples/store-imports-hoisted/foo.js create mode 100644 test/runtime/samples/store-imports-hoisted/main.svelte create mode 100644 test/runtime/samples/store-shadow-scope/_config.js create mode 100644 test/runtime/samples/store-shadow-scope/main.svelte create mode 100644 test/runtime/samples/store-template-expression-scope/_config.js create mode 100644 test/runtime/samples/store-template-expression-scope/main.svelte create mode 100644 test/runtime/samples/this-in-function-expressions/_config.js create mode 100644 test/runtime/samples/this-in-function-expressions/main.svelte create mode 100644 test/runtime/samples/transition-js-each-else-block-intro-outro/_config.js create mode 100644 test/runtime/samples/transition-js-each-else-block-intro-outro/main.svelte create mode 100644 test/runtime/samples/transition-js-each-else-block-intro/_config.js create mode 100644 test/runtime/samples/transition-js-each-else-block-intro/main.svelte create mode 100644 test/runtime/samples/transition-js-each-else-block-outro/_config.js create mode 100644 test/runtime/samples/transition-js-each-else-block-outro/main.svelte create mode 100644 test/validator/samples/a11y-contenteditable-element-without-child/errors.json create mode 100644 test/validator/samples/a11y-contenteditable-element-without-child/input.svelte create mode 100644 test/validator/samples/a11y-label-has-associated-control/input.svelte create mode 100644 test/validator/samples/a11y-label-has-associated-control/warnings.json create mode 100644 test/validator/samples/a11y-media-has-caption/input.svelte create mode 100644 test/validator/samples/a11y-media-has-caption/warnings.json diff --git a/.eslintignore b/.eslintignore index b5cb03ae6e..d123c10530 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,7 +2,6 @@ **/expected.js _output test/*/samples/*/output.js -node_modules # automatically generated internal_exports.ts diff --git a/.eslintrc.js b/.eslintrc.js index 946a157e40..a093de610b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,65 +1,6 @@ module.exports = { root: true, - rules: { - indent: 'off', - 'no-unused-vars': 'off', - semi: [2, 'always'], - 'keyword-spacing': [2, { before: true, after: true }], - 'space-before-blocks': [2, 'always'], - 'no-mixed-spaces-and-tabs': [2, 'smart-tabs'], - 'no-cond-assign': 0, - 'object-shorthand': [2, 'always'], - 'no-const-assign': 2, - 'no-class-assign': 2, - 'no-this-before-super': 2, - 'no-var': 2, - 'no-unreachable': 2, - 'valid-typeof': 2, - 'quote-props': [2, 'as-needed'], - 'one-var': [2, 'never'], - 'prefer-arrow-callback': 2, - 'prefer-const': [2, { destructuring: 'all' }], - 'arrow-spacing': 2, - 'no-inner-declarations': 0, - 'require-atomic-updates': 'off', - '@typescript-eslint/indent': 'off', - '@typescript-eslint/camelcase': 'off', - '@typescript-eslint/no-use-before-define': 'off', - '@typescript-eslint/array-type': ['error', 'array-simple'], - '@typescript-eslint/explicit-function-return-type': 'off', - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/explicit-member-accessibility': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - argsIgnorePattern: '^_' - } - ], - '@typescript-eslint/no-object-literal-type-assertion': 'off', - '@typescript-eslint/no-unused-vars': 'off', - '@typescript-eslint/prefer-interface': 'off' - }, - globals: { - globalThis: false - }, - env: { - es6: true, - browser: true, - node: true, - mocha: true - }, - extends: [ - 'eslint:recommended', - 'plugin:import/errors', - 'plugin:import/warnings', - 'plugin:import/typescript', - 'plugin:@typescript-eslint/recommended' - ], - parserOptions: { - ecmaVersion: 9, - sourceType: 'module' - }, - plugins: ['svelte3'], + extends: '@sveltejs', settings: { 'import/core-modules': [ 'svelte', @@ -69,20 +10,5 @@ module.exports = { 'estree' ], 'svelte3/compiler': require('./compiler') - }, - overrides: [ - { - files: ['*.js'], - rules: { - '@typescript-eslint/no-var-requires': 'off' - } - }, - { - files: ['*.svelte'], - processor: 'svelte3/svelte3', - rules: { - '@typescript-eslint/indent': 'off' - } - } - ] + } }; diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 6871094f5c..7daff3f1ab 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -8,10 +8,13 @@ the issue. One way we prioritize issues is by the number of :+1: reactions on their descriptions. Please DO NOT add `+1` or :+1: comments. ### Feature requests and proposals + We're excited to hear how we can make Svelte better. Please add as much detail -as you can on your use case. +as you can on your use case. To propose an implementation of a large feature or +change, please create an [RFC](https://github.com/sveltejs/rfcs). ### Bugs + If you're filing an issue about a bug please include as much information as you can including the following. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index e533c21c96..923bfdb50c 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -7,6 +7,11 @@ assignees: '' --- + + **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. For example: I'm always frustrated when [...] diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1e77e0337a..d14a0f9fe4 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,8 +1,7 @@ - - ### Before submitting the PR, please make sure you do the following -- [ ] It's really useful if your PR relates to an outstanding issue, so please reference it in your PR, or create an explanatory one for discussion. In many cases features are absent for a reason. -- [ ] This message body should clearly illustrate what problems it solves. If there are related issues, remember to reference them. -- [ ] Ideally, include a test that fails without this PR but passes with it. PRs will only be merged once they pass CI. (Remember to `npm run lint`!) +- [ ] It's really useful if your PR references an issue where it is discussed ahead of time. In many cases, features are absent for a reason. For large changes, please create an RFC: https://github.com/sveltejs/rfcs +- [ ] This message body should clearly illustrate what problems it solves. +- [ ] Ideally, include a test that fails without this PR but passes with it. + ### Tests -- [ ] Run the tests tests with `npm test` or `yarn test`) +- [ ] Run the tests with `npm test` and lint the project with `npm run lint` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 457ddb3bab..4e04386fcc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,12 +3,12 @@ on: [push, pull_request] jobs: Tests: runs-on: ${{ matrix.os }} + timeout-minutes: 10 strategy: matrix: node-version: [8, 10, 12, 14] os: [ubuntu-latest, windows-latest, macOS-latest] steps: - - run: git config --global core.autocrlf false - uses: actions/checkout@v1 - uses: actions/setup-node@v1 with: @@ -19,12 +19,17 @@ jobs: CI: true Lint: runs-on: ubuntu-latest + timeout-minutes: 2 steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 - run: 'npm i && npm run lint' Unit: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + timeout-minutes: 5 + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macOS-latest] steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fd3d96fbe..0ccfeff273 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,11 +2,72 @@ ## Unreleased +* Expose object of which slots have received content in `$$slots` ([#2106](https://github.com/sveltejs/svelte/issues/2106)) +* Re-throw an unhandled rejection when an `{#await}` block with no `{:catch}` gets a rejection ([#5129](https://github.com/sveltejs/svelte/issues/5129)) +* Add types to `createEventDispatcher` ([#5211](https://github.com/sveltejs/svelte/issues/5211)) +* In SSR mode, do not automatically declare variables for reactive assignments to member expressions ([#5247](https://github.com/sveltejs/svelte/issues/5247)) +* Include selector in message of `unused-css-selector` warning ([#5252](https://github.com/sveltejs/svelte/issues/5252)) +* Fix using ``s in child `{#await}`/`{#each}` contexts ([#5255](https://github.com/sveltejs/svelte/issues/5255)) +* Fix using `` in `{:catch}` ([#5259](https://github.com/sveltejs/svelte/issues/5259)) +* Fix setting one-way bound `` `value` to `undefined` when it has spread attributes ([#5270](https://github.com/sveltejs/svelte/issues/5270)) +* Fix deep two-way bindings inside an `{#each}` involving a store ([#5286](https://github.com/sveltejs/svelte/issues/5286)) + +## 3.24.1 + +* Prevent duplicate invalidation with certain two-way component bindings ([#3180](https://github.com/sveltejs/svelte/issues/3180), [#5117](https://github.com/sveltejs/svelte/issues/5117), [#5144](https://github.com/sveltejs/svelte/issues/5144)) +* Fix reactivity when passing `$$props` to a `` ([#3364](https://github.com/sveltejs/svelte/issues/3364)) +* Fix transitions on `{#each}` `{:else}` ([#4970](https://github.com/sveltejs/svelte/issues/4970)) +* Fix unneeded invalidation of `$$props` and `$$restProps` ([#4993](https://github.com/sveltejs/svelte/issues/4993), [#5118](https://github.com/sveltejs/svelte/issues/5118)) +* Provide better compiler error message when mismatched tags are due to autoclosing of tags ([#5049](https://github.com/sveltejs/svelte/issues/5049)) +* Add `a11y-label-has-associated-control` warning ([#5074](https://github.com/sveltejs/svelte/pull/5074)) +* Add `a11y-media-has-caption` warning ([#5075](https://github.com/sveltejs/svelte/pull/5075)) +* Fix `bind:group` when using contextual reference ([#5174](https://github.com/sveltejs/svelte/issues/5174)) + +## 3.24.0 + +* Support nullish coalescing (`??`) and optional chaining (`?.`) operators ([#1972](https://github.com/sveltejs/svelte/issues/1972)) +* Support `import.meta` ([#4379](https://github.com/sveltejs/svelte/issues/4379)) +* Fix only setting `` values when they're changed when there are spread attributes ([#4418](https://github.com/sveltejs/svelte/issues/4418)) +* Fix placement of `{@html}` when used at the root of a slot, at the root of a component, or in `` ([#5012](https://github.com/sveltejs/svelte/issues/5012), [#5071](https://github.com/sveltejs/svelte/pull/5071)) +* Fix certain handling of two-way bound `contenteditable` elements ([#5018](https://github.com/sveltejs/svelte/issues/5018)) +* Fix handling of `import`ed value that is used as a store and is also mutated ([#5019](https://github.com/sveltejs/svelte/issues/5019)) +* Do not display `a11y-missing-content` warning on elements with `contenteditable` bindings ([#5020](https://github.com/sveltejs/svelte/issues/5020)) +* Fix handling of `this` in inline function expressions in the template ([#5033](https://github.com/sveltejs/svelte/issues/5033)) +* Fix collapsing HTML with static content ([#5040](https://github.com/sveltejs/svelte/issues/5040)) +* Prevent use of `$store` at compile time when top-level `store` has been shadowed ([#5048](https://github.com/sveltejs/svelte/issues/5048)) +* Update ` + + + + +{#if files} +

Selected files:

+ {#each Array.from(files) as file} +

{file.name} ({file.size} bytes)

+ {/each} +{/if} diff --git a/site/content/examples/05-bindings/05-file-inputs/meta.json b/site/content/examples/05-bindings/05-file-inputs/meta.json new file mode 100644 index 0000000000..92d0587e87 --- /dev/null +++ b/site/content/examples/05-bindings/05-file-inputs/meta.json @@ -0,0 +1,3 @@ +{ + "title": "File inputs" +} diff --git a/site/content/examples/05-bindings/05-select-bindings/App.svelte b/site/content/examples/05-bindings/06-select-bindings/App.svelte similarity index 100% rename from site/content/examples/05-bindings/05-select-bindings/App.svelte rename to site/content/examples/05-bindings/06-select-bindings/App.svelte diff --git a/site/content/examples/05-bindings/05-select-bindings/meta.json b/site/content/examples/05-bindings/06-select-bindings/meta.json similarity index 100% rename from site/content/examples/05-bindings/05-select-bindings/meta.json rename to site/content/examples/05-bindings/06-select-bindings/meta.json diff --git a/site/content/examples/05-bindings/06-multiple-select-bindings/App.svelte b/site/content/examples/05-bindings/07-multiple-select-bindings/App.svelte similarity index 100% rename from site/content/examples/05-bindings/06-multiple-select-bindings/App.svelte rename to site/content/examples/05-bindings/07-multiple-select-bindings/App.svelte diff --git a/site/content/examples/05-bindings/06-multiple-select-bindings/meta.json b/site/content/examples/05-bindings/07-multiple-select-bindings/meta.json similarity index 100% rename from site/content/examples/05-bindings/06-multiple-select-bindings/meta.json rename to site/content/examples/05-bindings/07-multiple-select-bindings/meta.json diff --git a/site/content/examples/05-bindings/07-each-block-bindings/App.svelte b/site/content/examples/05-bindings/08-each-block-bindings/App.svelte similarity index 89% rename from site/content/examples/05-bindings/07-each-block-bindings/App.svelte rename to site/content/examples/05-bindings/08-each-block-bindings/App.svelte index ff91612ec5..4d3d75420c 100644 --- a/site/content/examples/05-bindings/07-each-block-bindings/App.svelte +++ b/site/content/examples/05-bindings/08-each-block-bindings/App.svelte @@ -16,16 +16,10 @@ $: remaining = todos.filter(t => !t.done).length; - -

Todos

{#each todos as todo} -
+
{/each} diff --git a/site/content/examples/05-bindings/07-each-block-bindings/meta.json b/site/content/examples/05-bindings/08-each-block-bindings/meta.json similarity index 100% rename from site/content/examples/05-bindings/07-each-block-bindings/meta.json rename to site/content/examples/05-bindings/08-each-block-bindings/meta.json diff --git a/site/content/examples/05-bindings/08-media-elements/App.svelte b/site/content/examples/05-bindings/09-media-elements/App.svelte similarity index 95% rename from site/content/examples/05-bindings/08-media-elements/App.svelte rename to site/content/examples/05-bindings/09-media-elements/App.svelte index 469e9e12eb..7a071dbe49 100644 --- a/site/content/examples/05-bindings/08-media-elements/App.svelte +++ b/site/content/examples/05-bindings/09-media-elements/App.svelte @@ -109,8 +109,8 @@
- + diff --git a/site/src/utils/highlight.js b/site/src/utils/highlight.js index d9e4fe5ec8..124af2e6be 100644 --- a/site/src/utils/highlight.js +++ b/site/src/utils/highlight.js @@ -1,6 +1,7 @@ import { langs } from '@sveltejs/site-kit/utils/markdown.js'; import PrismJS from 'prismjs'; import 'prismjs/components/prism-bash'; +import 'prismjs/components/prism-diff'; import 'prism-svelte'; export function highlight(source, lang) { diff --git a/site/static/examples/thumbnails/file-inputs.jpg b/site/static/examples/thumbnails/file-inputs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d302633f6b6fd370594d1d116dfb0b6a8adbd436 GIT binary patch literal 2751 zcmdT^XH?S(690z)O7jRIz*3Z@iBUkMgie+sC`DRm2`WtzB=jnRaCdMhf}*epxPS>I z2@s@{grdvAVp!>+1Oieep$SrS6#MnSvAAz*NI3O+Etq}T-cqjMkzJb_4Q~U7v zF#kAAK%n1mBp`@{gbYkZOIB9P&s^W!@BhZ(O8{~l=mC1bAPB$*0f8Z)!+!&E00;ns zjsScGm|s8;#CPn-X(0}Pz+gZ?h+l{gEcBlM5Z{p-A}9g<_5$oXCs$Mop>$AEN!RDt z#qfV*Kd-HOFQu)lg3vR!@QsYBf3V6q8W;kY0sCM3 z`70~J(r_{%N^+Y`*5Q$|Vzz^n0$h*lNo$U5t$|+9Vk+{mVyV52#tdYzrZ;(!4fcsx zyQ(=LCz2NwACo+eVYu`*2>!UpF7ht<6Ox418eOh%xx8pMEDVC-^enhC)ghQ94gBXB zb}|MK6qvNF-eu>O1zkotXQXCH_DMf?uUHW9O4KKMrFD8=b}^^E<)RrK#arNzmB_TQ z;K%Kk=r;M4w5QBPC+Mkk=%8y;(|zG`U9Z=~;PkAybn>Iqzb}^`1^vnXs>%l=H+?oW zk`4iuaNEqGzO9YDFR)3tFJHt-8Fe<0shr*apqoT67$n)FxQ}G30 zUD-bFu1z;_>L~^f6`B$-vLC*Dy1_+*$~jj59n>Q$Kaqvi*bhbVpy9 zAw7Pc{C9)d2vY;utXofhkQCL>Nqp7h>71qS4JO7moMlB9aK>3PyD3kIth^u-smFoC zLkXff{deFrcLVm6eE#eX9r%93TeWw2mK9N_KchxP%leS-h0~0Z2k>)pYX6$#l?SyY z7O2(fV9s(Vg~_GO-WqtVX8NSp2pYP6jLlAqjaC3%e6-Xr^Fj zpf|#-N{D|?p=5kIKn7payx>*+#Lf2M`^oi2ciFxrq(Lv|^d)u^d0cz! z)$f(UU0Im0)D_w3qR8@Q-vkfyYFg6~wgYURy4P~Grnt1dF&4RiHb;&U?IEs!y4C~`8c_l zC5t00)GA5-d4;VzRe{I%2ubkDtOanyCN_ZCtJ;Jp)0WS?ROy)$r0W#^paLm{-)`>; zEiW4z8@C+asm%;l(@s|RSiOubpj(k9RWSu0M_856dIFa5p&3Y;81xPoK^ z#`Ah?&Er|)IFG?MonGY5;sFt9jx2tN3g-op)mMD&RI2P2O>sG&j*bvYqLA<3;*4Hd zvZMtY(yROX<75&0Co9_O5T@3zoc^}E6ezXdrWjymd8^V*f4%uN1^1LTK|D|W>~2~T zeZEt{_*|NlvT`PAv{7H_G@wX#+DdIAJjB&cUhu4WFmI-Krqh1{%beIJ8r&OPi#9~X z&YPJ&QcTKR!4f?7Yh(_A%=$y17|nafNS7+F9Y%ThG@{@=Jw!i=OXZYB@;@WOU&<5@ zA#}=jRfdGxGGrMhMf=yXjLn{c2@Py+wdA?dGOH0QCT$AS$}92a`++exrbXYU@GX;i zbLrMpnG9u=dm0J~puq#b|M{;H{1WcPIu+5<)71;}3xbC+l@`Q=-rgsuX5CaCZ)FOc zG;i7om1{#rz?v)LI6Uy9>Na%uhNFBco;QuSoxE^1)NPY7a_n35?dHts5(D8$R%^%( msK;%(dOntP;!jWJ+ZMOFDq$@GdEnsBhx|I_Usy3aocI;?`dRb< literal 0 HcmV?d00001 diff --git a/site/static/media/svelte-ts.png b/site/static/media/svelte-ts.png new file mode 100644 index 0000000000000000000000000000000000000000..ed562822c3ce0dd85b32f6c792e70fce8e319687 GIT binary patch literal 189664 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

m_cN5*-D5fLdbJ*J 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 literal 0 HcmV?d00001 diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index a5a31c8070..ed2b10e404 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -8,7 +8,7 @@ import { create_scopes, extract_names, Scope, - extract_identifiers, + extract_identifiers } from './utils/scope'; import Stylesheet from './css/Stylesheet'; import { test } from '../config'; @@ -155,7 +155,7 @@ export default class Component { ) || { start: 0, end: 0 }; this.warn(svelteOptions, { code: 'custom-element-no-tag', - message: `No custom element 'tag' option was specified. To automatically register a custom element, specify a name with a hyphen in it, e.g. . To hide this warning, use `, + message: `No custom element 'tag' option was specified. To automatically register a custom element, specify a name with a hyphen in it, e.g. . To hide this warning, use ` }); } this.tag = this.component_options.tag || compile_options.tag; @@ -190,7 +190,7 @@ export default class Component { this.add_var({ name, injected: true, - referenced: true, + referenced: true }); } else if (name[0] === '$') { this.add_var({ @@ -198,7 +198,7 @@ export default class Component { injected: true, referenced: true, mutated: true, - writable: true, + writable: true }); const subscribable_name = name.slice(1); @@ -289,7 +289,7 @@ export default class Component { } const imported_helpers = Array.from(this.helpers, ([name, alias]) => ({ name, - alias, + alias })); create_module( @@ -305,7 +305,7 @@ export default class Component { .filter(variable => variable.module && variable.export_name) .map(variable => ({ name: variable.name, - as: variable.export_name, + as: variable.export_name })) ); @@ -342,9 +342,9 @@ export default class Component { reassigned: v.reassigned || false, referenced: v.referenced || false, writable: v.writable || false, - referenced_from_script: v.referenced_from_script || false, + referenced_from_script: v.referenced_from_script || false })), - stats: this.stats.render(), + stats: this.stats.render() }; } @@ -409,7 +409,7 @@ export default class Component { source: this.source, start: pos.start, end: pos.end, - filename: this.compile_options.filename, + filename: this.compile_options.filename }); } @@ -441,7 +441,7 @@ export default class Component { pos: pos.start, filename: this.compile_options.filename, toString: () => - `${warning.message} (${start.line}:${start.column})\n${frame}`, + `${warning.message} (${start.line}:${start.column})\n${frame}` }); } @@ -453,7 +453,7 @@ export default class Component { if (node.type === 'ExportDefaultDeclaration') { this.error(node, { code: `default-export`, - message: `A component cannot have a default export`, + message: `A component cannot have a default export` }); } @@ -461,7 +461,7 @@ export default class Component { if (node.source) { this.error(node, { code: `not-implemented`, - message: `A component currently cannot have an export ... from`, + message: `A component currently cannot have an export ... from` }); } if (node.declaration) { @@ -531,10 +531,10 @@ export default class Component { if (node.type === 'LabeledStatement' && node.label.name === '$') { component.warn(node as any, { code: 'module-script-reactive-declaration', - message: '$: has no effect in a module script', + message: '$: has no effect in a module script' }); } - }, + } }); const { scope, globals } = create_scopes(script.content); @@ -544,7 +544,7 @@ export default class Component { if (name[0] === '$') { this.error(node as any, { code: 'illegal-declaration', - message: `The $ prefix is reserved, and cannot be used for variable and import names`, + message: `The $ prefix is reserved, and cannot be used for variable and import names` }); } @@ -562,7 +562,7 @@ export default class Component { if (name[0] === '$') { this.error(node as any, { code: 'illegal-subscription', - message: `Cannot reference store value inside + \ No newline at end of file diff --git a/test/js/samples/inline-style-optimized-multiple/expected.js b/test/js/samples/inline-style-optimized-multiple/expected.js index 84a38abd7b..0a9d0a1e8e 100644 --- a/test/js/samples/inline-style-optimized-multiple/expected.js +++ b/test/js/samples/inline-style-optimized-multiple/expected.js @@ -44,7 +44,7 @@ function instance($$self, $$props, $$invalidate) { let { x } = $$props; let { y } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("color" in $$props) $$invalidate(0, color = $$props.color); if ("x" in $$props) $$invalidate(1, x = $$props.x); if ("y" in $$props) $$invalidate(2, y = $$props.y); diff --git a/test/js/samples/inline-style-optimized-url/expected.js b/test/js/samples/inline-style-optimized-url/expected.js index 77870348a5..0debb03585 100644 --- a/test/js/samples/inline-style-optimized-url/expected.js +++ b/test/js/samples/inline-style-optimized-url/expected.js @@ -37,7 +37,7 @@ function create_fragment(ctx) { function instance($$self, $$props, $$invalidate) { let { data } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("data" in $$props) $$invalidate(0, data = $$props.data); }; diff --git a/test/js/samples/inline-style-optimized/expected.js b/test/js/samples/inline-style-optimized/expected.js index 5bef284f09..b7db0f1cf3 100644 --- a/test/js/samples/inline-style-optimized/expected.js +++ b/test/js/samples/inline-style-optimized/expected.js @@ -37,7 +37,7 @@ function create_fragment(ctx) { function instance($$self, $$props, $$invalidate) { let { color } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("color" in $$props) $$invalidate(0, color = $$props.color); }; diff --git a/test/js/samples/inline-style-unoptimized/expected.js b/test/js/samples/inline-style-unoptimized/expected.js index fdff685ead..0688f14b9b 100644 --- a/test/js/samples/inline-style-unoptimized/expected.js +++ b/test/js/samples/inline-style-unoptimized/expected.js @@ -54,7 +54,7 @@ function instance($$self, $$props, $$invalidate) { let { key } = $$props; let { value } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("style" in $$props) $$invalidate(0, style = $$props.style); if ("key" in $$props) $$invalidate(1, key = $$props.key); if ("value" in $$props) $$invalidate(2, value = $$props.value); diff --git a/test/js/samples/input-files/expected.js b/test/js/samples/input-files/expected.js index 1c1e57fc9b..8adc7443f5 100644 --- a/test/js/samples/input-files/expected.js +++ b/test/js/samples/input-files/expected.js @@ -13,6 +13,7 @@ import { function create_fragment(ctx) { let input; + let mounted; let dispose; return { @@ -21,16 +22,20 @@ function create_fragment(ctx) { attr(input, "type", "file"); input.multiple = true; }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, input, anchor); - if (remount) dispose(); - dispose = listen(input, "change", /*input_change_handler*/ ctx[1]); + + if (!mounted) { + dispose = listen(input, "change", /*input_change_handler*/ ctx[1]); + mounted = true; + } }, p: noop, i: noop, o: noop, d(detaching) { if (detaching) detach(input); + mounted = false; dispose(); } }; @@ -44,7 +49,7 @@ function instance($$self, $$props, $$invalidate) { $$invalidate(0, files); } - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("files" in $$props) $$invalidate(0, files = $$props.files); }; diff --git a/test/js/samples/input-no-initial-value/expected.js b/test/js/samples/input-no-initial-value/expected.js index f72daa22a3..3354aa3111 100644 --- a/test/js/samples/input-no-initial-value/expected.js +++ b/test/js/samples/input-no-initial-value/expected.js @@ -20,6 +20,7 @@ function create_fragment(ctx) { let input; let t0; let button; + let mounted; let dispose; return { @@ -32,18 +33,21 @@ function create_fragment(ctx) { attr(input, "type", "text"); input.required = true; }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, form, anchor); append(form, input); set_input_value(input, /*test*/ ctx[0]); append(form, t0); append(form, button); - if (remount) run_all(dispose); - dispose = [ - listen(input, "input", /*input_input_handler*/ ctx[2]), - listen(form, "submit", /*handleSubmit*/ ctx[1]) - ]; + if (!mounted) { + dispose = [ + listen(input, "input", /*input_input_handler*/ ctx[2]), + listen(form, "submit", /*handleSubmit*/ ctx[1]) + ]; + + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*test*/ 1 && input.value !== /*test*/ ctx[0]) { @@ -54,6 +58,7 @@ function create_fragment(ctx) { o: noop, d(detaching) { if (detaching) detach(form); + mounted = false; run_all(dispose); } }; diff --git a/test/js/samples/input-range/expected.js b/test/js/samples/input-range/expected.js index 17a8065449..a855ca3653 100644 --- a/test/js/samples/input-range/expected.js +++ b/test/js/samples/input-range/expected.js @@ -16,6 +16,7 @@ import { function create_fragment(ctx) { let input; + let mounted; let dispose; return { @@ -23,15 +24,18 @@ function create_fragment(ctx) { input = element("input"); attr(input, "type", "range"); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, input, anchor); set_input_value(input, /*value*/ ctx[0]); - if (remount) run_all(dispose); - dispose = [ - listen(input, "change", /*input_change_input_handler*/ ctx[1]), - listen(input, "input", /*input_change_input_handler*/ ctx[1]) - ]; + if (!mounted) { + dispose = [ + listen(input, "change", /*input_change_input_handler*/ ctx[1]), + listen(input, "input", /*input_change_input_handler*/ ctx[1]) + ]; + + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*value*/ 1) { @@ -42,6 +46,7 @@ function create_fragment(ctx) { o: noop, d(detaching) { if (detaching) detach(input); + mounted = false; run_all(dispose); } }; @@ -55,7 +60,7 @@ function instance($$self, $$props, $$invalidate) { $$invalidate(0, value); } - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("value" in $$props) $$invalidate(0, value = $$props.value); }; diff --git a/test/js/samples/input-value/expected.js b/test/js/samples/input-value/expected.js index 31be2895ac..781a2ae603 100644 --- a/test/js/samples/input-value/expected.js +++ b/test/js/samples/input-value/expected.js @@ -20,6 +20,7 @@ function create_fragment(ctx) { let h1; let t1; let t2; + let mounted; let dispose; return { @@ -31,14 +32,17 @@ function create_fragment(ctx) { t2 = text("!"); input.value = /*name*/ ctx[0]; }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, input, anchor); insert(target, t0, anchor); insert(target, h1, anchor); append(h1, t1); append(h1, t2); - if (remount) dispose(); - dispose = listen(input, "input", /*onInput*/ ctx[1]); + + if (!mounted) { + dispose = listen(input, "input", /*onInput*/ ctx[1]); + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*name*/ 1 && input.value !== /*name*/ ctx[0]) { @@ -53,6 +57,7 @@ function create_fragment(ctx) { if (detaching) detach(input); if (detaching) detach(t0); if (detaching) detach(h1); + mounted = false; dispose(); } }; diff --git a/test/js/samples/input-without-blowback-guard/expected.js b/test/js/samples/input-without-blowback-guard/expected.js index 1e379032f3..6c5b215623 100644 --- a/test/js/samples/input-without-blowback-guard/expected.js +++ b/test/js/samples/input-without-blowback-guard/expected.js @@ -13,6 +13,7 @@ import { function create_fragment(ctx) { let input; + let mounted; let dispose; return { @@ -20,11 +21,14 @@ function create_fragment(ctx) { input = element("input"); attr(input, "type", "checkbox"); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, input, anchor); input.checked = /*foo*/ ctx[0]; - if (remount) dispose(); - dispose = listen(input, "change", /*input_change_handler*/ ctx[1]); + + if (!mounted) { + dispose = listen(input, "change", /*input_change_handler*/ ctx[1]); + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*foo*/ 1) { @@ -35,6 +39,7 @@ function create_fragment(ctx) { o: noop, d(detaching) { if (detaching) detach(input); + mounted = false; dispose(); } }; @@ -48,7 +53,7 @@ function instance($$self, $$props, $$invalidate) { $$invalidate(0, foo); } - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("foo" in $$props) $$invalidate(0, foo = $$props.foo); }; diff --git a/test/js/samples/instrumentation-script-if-no-block/expected.js b/test/js/samples/instrumentation-script-if-no-block/expected.js index f45e52aebd..7f51c64550 100644 --- a/test/js/samples/instrumentation-script-if-no-block/expected.js +++ b/test/js/samples/instrumentation-script-if-no-block/expected.js @@ -20,6 +20,7 @@ function create_fragment(ctx) { let p; let t2; let t3; + let mounted; let dispose; return { @@ -31,14 +32,17 @@ function create_fragment(ctx) { t2 = text("x: "); t3 = text(/*x*/ ctx[0]); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, button, anchor); insert(target, t1, anchor); insert(target, p, anchor); append(p, t2); append(p, t3); - if (remount) dispose(); - dispose = listen(button, "click", /*foo*/ ctx[1]); + + if (!mounted) { + dispose = listen(button, "click", /*foo*/ ctx[1]); + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*x*/ 1) set_data(t3, /*x*/ ctx[0]); @@ -49,6 +53,7 @@ function create_fragment(ctx) { if (detaching) detach(button); if (detaching) detach(t1); if (detaching) detach(p); + mounted = false; dispose(); } }; diff --git a/test/js/samples/instrumentation-script-x-equals-x/expected.js b/test/js/samples/instrumentation-script-x-equals-x/expected.js index 9fe9640978..ea0d65acb9 100644 --- a/test/js/samples/instrumentation-script-x-equals-x/expected.js +++ b/test/js/samples/instrumentation-script-x-equals-x/expected.js @@ -21,6 +21,7 @@ function create_fragment(ctx) { let t2; let t3_value = /*things*/ ctx[0].length + ""; let t3; + let mounted; let dispose; return { @@ -32,14 +33,17 @@ function create_fragment(ctx) { t2 = text("number of things: "); t3 = text(t3_value); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, button, anchor); insert(target, t1, anchor); insert(target, p, anchor); append(p, t2); append(p, t3); - if (remount) dispose(); - dispose = listen(button, "click", /*foo*/ ctx[1]); + + if (!mounted) { + dispose = listen(button, "click", /*foo*/ ctx[1]); + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*things*/ 1 && t3_value !== (t3_value = /*things*/ ctx[0].length + "")) set_data(t3, t3_value); @@ -50,6 +54,7 @@ function create_fragment(ctx) { if (detaching) detach(button); if (detaching) detach(t1); if (detaching) detach(p); + mounted = false; dispose(); } }; diff --git a/test/js/samples/instrumentation-template-if-no-block/expected.js b/test/js/samples/instrumentation-template-if-no-block/expected.js index 6f3bea4010..0c2713a9cc 100644 --- a/test/js/samples/instrumentation-template-if-no-block/expected.js +++ b/test/js/samples/instrumentation-template-if-no-block/expected.js @@ -20,6 +20,7 @@ function create_fragment(ctx) { let p; let t2; let t3; + let mounted; let dispose; return { @@ -31,14 +32,17 @@ function create_fragment(ctx) { t2 = text("x: "); t3 = text(/*x*/ ctx[0]); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, button, anchor); insert(target, t1, anchor); insert(target, p, anchor); append(p, t2); append(p, t3); - if (remount) dispose(); - dispose = listen(button, "click", /*click_handler*/ ctx[1]); + + if (!mounted) { + dispose = listen(button, "click", /*click_handler*/ ctx[1]); + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*x*/ 1) set_data(t3, /*x*/ ctx[0]); @@ -49,6 +53,7 @@ function create_fragment(ctx) { if (detaching) detach(button); if (detaching) detach(t1); if (detaching) detach(p); + mounted = false; dispose(); } }; diff --git a/test/js/samples/instrumentation-template-x-equals-x/expected.js b/test/js/samples/instrumentation-template-x-equals-x/expected.js index ed095353bd..55cd310661 100644 --- a/test/js/samples/instrumentation-template-x-equals-x/expected.js +++ b/test/js/samples/instrumentation-template-x-equals-x/expected.js @@ -21,6 +21,7 @@ function create_fragment(ctx) { let t2; let t3_value = /*things*/ ctx[0].length + ""; let t3; + let mounted; let dispose; return { @@ -32,14 +33,17 @@ function create_fragment(ctx) { t2 = text("number of things: "); t3 = text(t3_value); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, button, anchor); insert(target, t1, anchor); insert(target, p, anchor); append(p, t2); append(p, t3); - if (remount) dispose(); - dispose = listen(button, "click", /*click_handler*/ ctx[1]); + + if (!mounted) { + dispose = listen(button, "click", /*click_handler*/ ctx[1]); + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*things*/ 1 && t3_value !== (t3_value = /*things*/ ctx[0].length + "")) set_data(t3, t3_value); @@ -50,6 +54,7 @@ function create_fragment(ctx) { if (detaching) detach(button); if (detaching) detach(t1); if (detaching) detach(p); + mounted = false; dispose(); } }; diff --git a/test/js/samples/loop-protect/_config.js b/test/js/samples/loop-protect/_config.js index fcbf8be09b..1dc927b4da 100644 --- a/test/js/samples/loop-protect/_config.js +++ b/test/js/samples/loop-protect/_config.js @@ -1,6 +1,6 @@ export default { options: { dev: true, - loopGuardTimeout: 100, - }, + loopGuardTimeout: 100 + } }; diff --git a/test/js/samples/loop-protect/expected.js b/test/js/samples/loop-protect/expected.js index c52d9df437..1042b20823 100644 --- a/test/js/samples/loop-protect/expected.js +++ b/test/js/samples/loop-protect/expected.js @@ -67,6 +67,8 @@ function foo() { } function instance($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Component", slots, []); let node; { @@ -111,12 +113,10 @@ function instance($$self, $$props, $$invalidate) { if (!~writable_props.indexOf(key) && key.slice(0, 2) !== "$$") console_1.warn(` was created with unknown prop '${key}'`); }); - let { $$slots = {}, $$scope } = $$props; - validate_slots("Component", $$slots, []); - function div_binding($$value) { binding_callbacks[$$value ? "unshift" : "push"](() => { - $$invalidate(0, node = $$value); + node = $$value; + $$invalidate(0, node); }); } diff --git a/test/js/samples/media-bindings/expected.js b/test/js/samples/media-bindings/expected.js index 0849a38b51..867d4a7dad 100644 --- a/test/js/samples/media-bindings/expected.js +++ b/test/js/samples/media-bindings/expected.js @@ -19,6 +19,7 @@ function create_fragment(ctx) { let audio_updating = false; let audio_animationframe; let audio_is_paused = true; + let mounted; let dispose; function audio_timeupdate_handler() { @@ -42,7 +43,7 @@ function create_fragment(ctx) { if (/*seeking*/ ctx[9] === void 0) add_render_callback(() => /*audio_seeking_seeked_handler*/ ctx[18].call(audio)); if (/*ended*/ ctx[10] === void 0) add_render_callback(() => /*audio_ended_handler*/ ctx[19].call(audio)); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, audio, anchor); if (!isNaN(/*volume*/ ctx[6])) { @@ -55,21 +56,23 @@ function create_fragment(ctx) { audio.playbackRate = /*playbackRate*/ ctx[8]; } - if (remount) run_all(dispose); - - dispose = [ - listen(audio, "progress", /*audio_progress_handler*/ ctx[11]), - listen(audio, "loadedmetadata", /*audio_loadedmetadata_handler*/ ctx[12]), - listen(audio, "timeupdate", audio_timeupdate_handler), - listen(audio, "durationchange", /*audio_durationchange_handler*/ ctx[14]), - listen(audio, "play", /*audio_play_pause_handler*/ ctx[15]), - listen(audio, "pause", /*audio_play_pause_handler*/ ctx[15]), - listen(audio, "volumechange", /*audio_volumechange_handler*/ ctx[16]), - listen(audio, "ratechange", /*audio_ratechange_handler*/ ctx[17]), - listen(audio, "seeking", /*audio_seeking_seeked_handler*/ ctx[18]), - listen(audio, "seeked", /*audio_seeking_seeked_handler*/ ctx[18]), - listen(audio, "ended", /*audio_ended_handler*/ ctx[19]) - ]; + if (!mounted) { + dispose = [ + listen(audio, "progress", /*audio_progress_handler*/ ctx[11]), + listen(audio, "loadedmetadata", /*audio_loadedmetadata_handler*/ ctx[12]), + listen(audio, "timeupdate", audio_timeupdate_handler), + listen(audio, "durationchange", /*audio_durationchange_handler*/ ctx[14]), + listen(audio, "play", /*audio_play_pause_handler*/ ctx[15]), + listen(audio, "pause", /*audio_play_pause_handler*/ ctx[15]), + listen(audio, "volumechange", /*audio_volumechange_handler*/ ctx[16]), + listen(audio, "ratechange", /*audio_ratechange_handler*/ ctx[17]), + listen(audio, "seeking", /*audio_seeking_seeked_handler*/ ctx[18]), + listen(audio, "seeked", /*audio_seeking_seeked_handler*/ ctx[18]), + listen(audio, "ended", /*audio_ended_handler*/ ctx[19]) + ]; + + mounted = true; + } }, p(ctx, [dirty]) { if (!audio_updating && dirty & /*currentTime*/ 8 && !isNaN(/*currentTime*/ ctx[3])) { @@ -98,6 +101,7 @@ function create_fragment(ctx) { o: noop, d(detaching) { if (detaching) detach(audio); + mounted = false; run_all(dispose); } }; @@ -169,7 +173,7 @@ function instance($$self, $$props, $$invalidate) { $$invalidate(10, ended); } - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("buffered" in $$props) $$invalidate(0, buffered = $$props.buffered); if ("seekable" in $$props) $$invalidate(1, seekable = $$props.seekable); if ("played" in $$props) $$invalidate(2, played = $$props.played); diff --git a/test/js/samples/non-imported-component/expected.js b/test/js/samples/non-imported-component/expected.js index 2784fd17ac..5a6b8e8bb7 100644 --- a/test/js/samples/non-imported-component/expected.js +++ b/test/js/samples/non-imported-component/expected.js @@ -17,10 +17,12 @@ import { import Imported from "Imported.svelte"; function create_fragment(ctx) { + let imported; let t; + let nonimported; let current; - const imported = new Imported({}); - const nonimported = new NonImported({}); + imported = new Imported({}); + nonimported = new NonImported({}); return { c() { diff --git a/test/js/samples/optional-chaining/expected.js b/test/js/samples/optional-chaining/expected.js new file mode 100644 index 0000000000..8aa94796c1 --- /dev/null +++ b/test/js/samples/optional-chaining/expected.js @@ -0,0 +1,189 @@ +/* generated by Svelte vX.Y.Z */ +import { + SvelteComponent, + attr, + create_component, + destroy_component, + detach, + element, + init, + insert, + mount_component, + safe_not_equal, + set_data, + space, + text, + transition_in, + transition_out +} from "svelte/internal"; + +function create_fragment(ctx) { + let t0_value = /*a*/ ctx[0].normal + ""; + let t0; + let t1_value = /*b*/ ctx[1]?.optional + ""; + let t1; + let t2; + let t3_value = /*c*/ ctx[2]["computed"] + ""; + let t3; + let t4_value = /*d*/ ctx[3]?.["computed_optional"] + ""; + let t4; + let t5; + let t6_value = /*e*/ ctx[4]() + ""; + let t6; + let t7_value = /*f*/ ctx[5]?.() + ""; + let t7; + let t8; + let div; + let div_a_value; + let div_b_value; + let div_c_value; + let div_d_value; + let div_e_value; + let div_f_value; + let t9; + let component; + let current; + + component = new /*Component*/ ctx[6]({ + props: { + a: /*a*/ ctx[0].normal, + b: /*b*/ ctx[1]?.optional, + c: /*c*/ ctx[2]["computed"], + d: /*d*/ ctx[3]?.["computed_optional"], + e: /*e*/ ctx[4](), + f: /*f*/ ctx[5]?.() + } + }); + + return { + c() { + t0 = text(t0_value); + t1 = text(t1_value); + t2 = space(); + t3 = text(t3_value); + t4 = text(t4_value); + t5 = space(); + t6 = text(t6_value); + t7 = text(t7_value); + t8 = space(); + div = element("div"); + t9 = space(); + create_component(component.$$.fragment); + attr(div, "a", div_a_value = /*a*/ ctx[0].normal); + attr(div, "b", div_b_value = /*b*/ ctx[1]?.optional); + attr(div, "c", div_c_value = /*c*/ ctx[2]["computed"]); + attr(div, "d", div_d_value = /*d*/ ctx[3]?.["computed_optional"]); + attr(div, "e", div_e_value = /*e*/ ctx[4]()); + attr(div, "f", div_f_value = /*f*/ ctx[5]?.()); + }, + m(target, anchor) { + insert(target, t0, anchor); + insert(target, t1, anchor); + insert(target, t2, anchor); + insert(target, t3, anchor); + insert(target, t4, anchor); + insert(target, t5, anchor); + insert(target, t6, anchor); + insert(target, t7, anchor); + insert(target, t8, anchor); + insert(target, div, anchor); + insert(target, t9, anchor); + mount_component(component, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + if ((!current || dirty & /*a*/ 1) && t0_value !== (t0_value = /*a*/ ctx[0].normal + "")) set_data(t0, t0_value); + if ((!current || dirty & /*b*/ 2) && t1_value !== (t1_value = /*b*/ ctx[1]?.optional + "")) set_data(t1, t1_value); + if ((!current || dirty & /*c*/ 4) && t3_value !== (t3_value = /*c*/ ctx[2]["computed"] + "")) set_data(t3, t3_value); + if ((!current || dirty & /*d*/ 8) && t4_value !== (t4_value = /*d*/ ctx[3]?.["computed_optional"] + "")) set_data(t4, t4_value); + if ((!current || dirty & /*e*/ 16) && t6_value !== (t6_value = /*e*/ ctx[4]() + "")) set_data(t6, t6_value); + if ((!current || dirty & /*f*/ 32) && t7_value !== (t7_value = /*f*/ ctx[5]?.() + "")) set_data(t7, t7_value); + + if (!current || dirty & /*a*/ 1 && div_a_value !== (div_a_value = /*a*/ ctx[0].normal)) { + attr(div, "a", div_a_value); + } + + if (!current || dirty & /*b*/ 2 && div_b_value !== (div_b_value = /*b*/ ctx[1]?.optional)) { + attr(div, "b", div_b_value); + } + + if (!current || dirty & /*c*/ 4 && div_c_value !== (div_c_value = /*c*/ ctx[2]["computed"])) { + attr(div, "c", div_c_value); + } + + if (!current || dirty & /*d*/ 8 && div_d_value !== (div_d_value = /*d*/ ctx[3]?.["computed_optional"])) { + attr(div, "d", div_d_value); + } + + if (!current || dirty & /*e*/ 16 && div_e_value !== (div_e_value = /*e*/ ctx[4]())) { + attr(div, "e", div_e_value); + } + + if (!current || dirty & /*f*/ 32 && div_f_value !== (div_f_value = /*f*/ ctx[5]?.())) { + attr(div, "f", div_f_value); + } + + const component_changes = {}; + if (dirty & /*a*/ 1) component_changes.a = /*a*/ ctx[0].normal; + if (dirty & /*b*/ 2) component_changes.b = /*b*/ ctx[1]?.optional; + if (dirty & /*c*/ 4) component_changes.c = /*c*/ ctx[2]["computed"]; + if (dirty & /*d*/ 8) component_changes.d = /*d*/ ctx[3]?.["computed_optional"]; + if (dirty & /*e*/ 16) component_changes.e = /*e*/ ctx[4](); + if (dirty & /*f*/ 32) component_changes.f = /*f*/ ctx[5]?.(); + component.$set(component_changes); + }, + i(local) { + if (current) return; + transition_in(component.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(component.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(t0); + if (detaching) detach(t1); + if (detaching) detach(t2); + if (detaching) detach(t3); + if (detaching) detach(t4); + if (detaching) detach(t5); + if (detaching) detach(t6); + if (detaching) detach(t7); + if (detaching) detach(t8); + if (detaching) detach(div); + if (detaching) detach(t9); + destroy_component(component, detaching); + } + }; +} + +function instance($$self, $$props, $$invalidate) { + let { a } = $$props; + let { b } = $$props; + let { c } = $$props; + let { d } = $$props; + let { e } = $$props; + let { f } = $$props; + let Component; + + $$self.$$set = $$props => { + if ("a" in $$props) $$invalidate(0, a = $$props.a); + if ("b" in $$props) $$invalidate(1, b = $$props.b); + if ("c" in $$props) $$invalidate(2, c = $$props.c); + if ("d" in $$props) $$invalidate(3, d = $$props.d); + if ("e" in $$props) $$invalidate(4, e = $$props.e); + if ("f" in $$props) $$invalidate(5, f = $$props.f); + }; + + return [a, b, c, d, e, f, Component]; +} + +class Component_1 extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { a: 0, b: 1, c: 2, d: 3, e: 4, f: 5 }); + } +} + +export default Component_1; \ No newline at end of file diff --git a/test/js/samples/optional-chaining/input.svelte b/test/js/samples/optional-chaining/input.svelte new file mode 100644 index 0000000000..78edf2ca85 --- /dev/null +++ b/test/js/samples/optional-chaining/input.svelte @@ -0,0 +1,31 @@ + + +{a.normal}{b?.optional} +{c['computed']}{d?.['computed_optional']} +{e()}{f?.()} + +

+ + diff --git a/test/js/samples/reactive-values-non-topologically-ordered/expected.js b/test/js/samples/reactive-values-non-topologically-ordered/expected.js index 3d266f10ac..15290496d5 100644 --- a/test/js/samples/reactive-values-non-topologically-ordered/expected.js +++ b/test/js/samples/reactive-values-non-topologically-ordered/expected.js @@ -6,7 +6,7 @@ function instance($$self, $$props, $$invalidate) { let a; let b; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("x" in $$props) $$invalidate(0, x = $$props.x); }; diff --git a/test/js/samples/reactive-values-non-writable-dependencies/expected.js b/test/js/samples/reactive-values-non-writable-dependencies/expected.js index 38bd356d85..5196a770d9 100644 --- a/test/js/samples/reactive-values-non-writable-dependencies/expected.js +++ b/test/js/samples/reactive-values-non-writable-dependencies/expected.js @@ -5,7 +5,7 @@ function instance($$self, $$props, $$invalidate) { let { a = 1 } = $$props; let { b = 2 } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("a" in $$props) $$invalidate(0, a = $$props.a); if ("b" in $$props) $$invalidate(1, b = $$props.b); }; diff --git a/test/js/samples/select-dynamic-value/expected.js b/test/js/samples/select-dynamic-value/expected.js index a93a47bd3a..8777cd2600 100644 --- a/test/js/samples/select-dynamic-value/expected.js +++ b/test/js/samples/select-dynamic-value/expected.js @@ -7,14 +7,14 @@ import { init, insert, noop, - safe_not_equal + safe_not_equal, + select_option } from "svelte/internal"; function create_fragment(ctx) { let select; let option0; let option1; - let select_value_value; return { c() { @@ -32,27 +32,11 @@ function create_fragment(ctx) { insert(target, select, anchor); append(select, option0); append(select, option1); - select_value_value = /*current*/ ctx[0]; - - for (var i = 0; i < select.options.length; i += 1) { - var option = select.options[i]; - - if (option.__value === select_value_value) { - option.selected = true; - break; - } - } + select_option(select, /*current*/ ctx[0]); }, p(ctx, [dirty]) { - if (dirty & /*current*/ 1 && select_value_value !== (select_value_value = /*current*/ ctx[0])) { - for (var i = 0; i < select.options.length; i += 1) { - var option = select.options[i]; - - if (option.__value === select_value_value) { - option.selected = true; - break; - } - } + if (dirty & /*current*/ 1) { + select_option(select, /*current*/ ctx[0]); } }, i: noop, @@ -66,7 +50,7 @@ function create_fragment(ctx) { function instance($$self, $$props, $$invalidate) { let { current } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("current" in $$props) $$invalidate(0, current = $$props.current); }; diff --git a/test/js/samples/src-attribute-check/expected.js b/test/js/samples/src-attribute-check/expected.js index e03b3a6ba7..93638edfb4 100644 --- a/test/js/samples/src-attribute-check/expected.js +++ b/test/js/samples/src-attribute-check/expected.js @@ -67,7 +67,7 @@ function instance($$self, $$props, $$invalidate) { let { url } = $$props; let { slug } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("url" in $$props) $$invalidate(0, url = $$props.url); if ("slug" in $$props) $$invalidate(1, slug = $$props.slug); }; diff --git a/test/js/samples/ssr-no-oncreate-etc/expected.js b/test/js/samples/ssr-no-oncreate-etc/expected.js index 803f06a882..b91deb3e97 100644 --- a/test/js/samples/ssr-no-oncreate-etc/expected.js +++ b/test/js/samples/ssr-no-oncreate-etc/expected.js @@ -15,7 +15,7 @@ function swipe(node, callback) { } // TODO implement -const Component = create_ssr_component(($$result, $$props, $$bindings, $$slots) => { +const Component = create_ssr_component(($$result, $$props, $$bindings, slots) => { onMount(() => { console.log("onMount"); }); diff --git a/test/js/samples/ssr-preserve-comments/expected.js b/test/js/samples/ssr-preserve-comments/expected.js index 1dc12710c0..de9fa7582e 100644 --- a/test/js/samples/ssr-preserve-comments/expected.js +++ b/test/js/samples/ssr-preserve-comments/expected.js @@ -1,7 +1,7 @@ /* generated by Svelte vX.Y.Z */ import { create_ssr_component } from "svelte/internal"; -const Component = create_ssr_component(($$result, $$props, $$bindings, $$slots) => { +const Component = create_ssr_component(($$result, $$props, $$bindings, slots) => { return `
content
more content
`; diff --git a/test/js/samples/title/expected.js b/test/js/samples/title/expected.js index d4e7e1a584..b10f569759 100644 --- a/test/js/samples/title/expected.js +++ b/test/js/samples/title/expected.js @@ -22,7 +22,7 @@ function create_fragment(ctx) { function instance($$self, $$props, $$invalidate) { let { custom } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("custom" in $$props) $$invalidate(0, custom = $$props.custom); }; diff --git a/test/js/samples/transition-local/expected.js b/test/js/samples/transition-local/expected.js index 25a03f026f..ea3d9db3d7 100644 --- a/test/js/samples/transition-local/expected.js +++ b/test/js/samples/transition-local/expected.js @@ -124,7 +124,7 @@ function instance($$self, $$props, $$invalidate) { let { x } = $$props; let { y } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("x" in $$props) $$invalidate(0, x = $$props.x); if ("y" in $$props) $$invalidate(1, y = $$props.y); }; diff --git a/test/js/samples/transition-repeated-outro/expected.js b/test/js/samples/transition-repeated-outro/expected.js index 1f76a93666..12483ab91a 100644 --- a/test/js/samples/transition-repeated-outro/expected.js +++ b/test/js/samples/transition-repeated-outro/expected.js @@ -102,7 +102,7 @@ function create_fragment(ctx) { function instance($$self, $$props, $$invalidate) { let { num = 1 } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("num" in $$props) $$invalidate(0, num = $$props.num); }; diff --git a/test/js/samples/use-elements-as-anchors/expected.js b/test/js/samples/use-elements-as-anchors/expected.js index 5be8808edb..d07411518e 100644 --- a/test/js/samples/use-elements-as-anchors/expected.js +++ b/test/js/samples/use-elements-as-anchors/expected.js @@ -243,7 +243,7 @@ function instance($$self, $$props, $$invalidate) { let { d } = $$props; let { e } = $$props; - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("a" in $$props) $$invalidate(0, a = $$props.a); if ("b" in $$props) $$invalidate(1, b = $$props.b); if ("c" in $$props) $$invalidate(2, c = $$props.c); diff --git a/test/js/samples/video-bindings/expected.js b/test/js/samples/video-bindings/expected.js index 9c5467e1a0..8afa670bbb 100644 --- a/test/js/samples/video-bindings/expected.js +++ b/test/js/samples/video-bindings/expected.js @@ -19,6 +19,7 @@ function create_fragment(ctx) { let video_updating = false; let video_animationframe; let video_resize_listener; + let mounted; let dispose; function video_timeupdate_handler() { @@ -38,15 +39,18 @@ function create_fragment(ctx) { if (/*videoHeight*/ ctx[1] === void 0 || /*videoWidth*/ ctx[2] === void 0) add_render_callback(() => /*video_resize_handler*/ ctx[5].call(video)); add_render_callback(() => /*video_elementresize_handler*/ ctx[6].call(video)); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, video, anchor); video_resize_listener = add_resize_listener(video, /*video_elementresize_handler*/ ctx[6].bind(video)); - if (remount) run_all(dispose); - dispose = [ - listen(video, "timeupdate", video_timeupdate_handler), - listen(video, "resize", /*video_resize_handler*/ ctx[5]) - ]; + if (!mounted) { + dispose = [ + listen(video, "timeupdate", video_timeupdate_handler), + listen(video, "resize", /*video_resize_handler*/ ctx[5]) + ]; + + mounted = true; + } }, p(ctx, [dirty]) { if (!video_updating && dirty & /*currentTime*/ 1 && !isNaN(/*currentTime*/ ctx[0])) { @@ -60,6 +64,7 @@ function create_fragment(ctx) { d(detaching) { if (detaching) detach(video); video_resize_listener(); + mounted = false; run_all(dispose); } }; @@ -88,7 +93,7 @@ function instance($$self, $$props, $$invalidate) { $$invalidate(3, offsetWidth); } - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("currentTime" in $$props) $$invalidate(0, currentTime = $$props.currentTime); if ("videoHeight" in $$props) $$invalidate(1, videoHeight = $$props.videoHeight); if ("videoWidth" in $$props) $$invalidate(2, videoWidth = $$props.videoWidth); diff --git a/test/js/samples/window-binding-online/expected.js b/test/js/samples/window-binding-online/expected.js index fa955e4fd5..887195bce1 100644 --- a/test/js/samples/window-binding-online/expected.js +++ b/test/js/samples/window-binding-online/expected.js @@ -10,23 +10,27 @@ import { } from "svelte/internal"; function create_fragment(ctx) { + let mounted; let dispose; add_render_callback(/*onlinestatuschanged*/ ctx[1]); return { c: noop, - m(target, anchor, remount) { - if (remount) run_all(dispose); - - dispose = [ - listen(window, "online", /*onlinestatuschanged*/ ctx[1]), - listen(window, "offline", /*onlinestatuschanged*/ ctx[1]) - ]; + m(target, anchor) { + if (!mounted) { + dispose = [ + listen(window, "online", /*onlinestatuschanged*/ ctx[1]), + listen(window, "offline", /*onlinestatuschanged*/ ctx[1]) + ]; + + mounted = true; + } }, p: noop, i: noop, o: noop, d(detaching) { + mounted = false; run_all(dispose); } }; diff --git a/test/js/samples/window-binding-scroll/expected.js b/test/js/samples/window-binding-scroll/expected.js index 30723cc142..09a4d3737d 100644 --- a/test/js/samples/window-binding-scroll/expected.js +++ b/test/js/samples/window-binding-scroll/expected.js @@ -25,6 +25,7 @@ function create_fragment(ctx) { let p; let t0; let t1; + let mounted; let dispose; add_render_callback(/*onwindowscroll*/ ctx[1]); @@ -34,18 +35,21 @@ function create_fragment(ctx) { t0 = text("scrolled to "); t1 = text(/*y*/ ctx[0]); }, - m(target, anchor, remount) { + m(target, anchor) { insert(target, p, anchor); append(p, t0); append(p, t1); - if (remount) dispose(); - dispose = listen(window, "scroll", () => { - scrolling = true; - clearTimeout(scrolling_timeout); - scrolling_timeout = setTimeout(clear_scrolling, 100); - /*onwindowscroll*/ ctx[1](); - }); + if (!mounted) { + dispose = listen(window, "scroll", () => { + scrolling = true; + clearTimeout(scrolling_timeout); + scrolling_timeout = setTimeout(clear_scrolling, 100); + /*onwindowscroll*/ ctx[1](); + }); + + mounted = true; + } }, p(ctx, [dirty]) { if (dirty & /*y*/ 1 && !scrolling) { @@ -61,6 +65,7 @@ function create_fragment(ctx) { o: noop, d(detaching) { if (detaching) detach(p); + mounted = false; dispose(); } }; @@ -73,7 +78,7 @@ function instance($$self, $$props, $$invalidate) { $$invalidate(0, y = window.pageYOffset) } - $$self.$set = $$props => { + $$self.$$set = $$props => { if ("y" in $$props) $$invalidate(0, y = $$props.y); }; diff --git a/test/parser/index.js b/test/parser/index.js index 27c5ec1563..2c8d516a7d 100644 --- a/test/parser/index.js +++ b/test/parser/index.js @@ -20,7 +20,7 @@ describe('parse', () => { (skip ? it.skip : solo ? it.only : it)(dir, () => { const options = tryToLoadJson(`${__dirname}/samples/${dir}/options.json`) || {}; - const input = fs.readFileSync(`${__dirname}/samples/${dir}/input.svelte`, 'utf-8').replace(/\s+$/, ''); + const input = fs.readFileSync(`${__dirname}/samples/${dir}/input.svelte`, 'utf-8').replace(/\s+$/, '').replace(/\r/g, ""); const expectedOutput = tryToLoadJson(`${__dirname}/samples/${dir}/output.json`); const expectedError = tryToLoadJson(`${__dirname}/samples/${dir}/error.json`); @@ -38,13 +38,9 @@ describe('parse', () => { } catch (err) { if (err.name !== 'ParseError') throw err; if (!expectedError) throw err; - + const { code, message, pos, start } = err try { - assert.equal(err.code, expectedError.code); - assert.equal(err.message, expectedError.message); - assert.deepEqual(err.start, expectedError.start); - assert.equal(err.pos, expectedError.pos); - assert.equal(err.toString().split('\n')[0], `${expectedError.message} (${expectedError.start.line}:${expectedError.start.column})`); + assert.deepEqual({ code, message, pos, start }, expectedError); } catch (err2) { const e = err2.code === 'MODULE_NOT_FOUND' ? err : err2; throw e; diff --git a/test/parser/samples/action-with-call/output.json b/test/parser/samples/action-with-call/output.json index ccb4011c67..66c569dc5a 100644 --- a/test/parser/samples/action-with-call/output.json +++ b/test/parser/samples/action-with-call/output.json @@ -64,7 +64,8 @@ "value": "tooltip msg", "raw": "'tooltip msg'" } - ] + ], + "optional": false } } ], diff --git a/test/parser/samples/animation/output.json b/test/parser/samples/animation/output.json index 1958ba2817..11195009c8 100644 --- a/test/parser/samples/animation/output.json +++ b/test/parser/samples/animation/output.json @@ -52,10 +52,10 @@ } ], "context": { - "start": 17, - "end": 22, "type": "Identifier", - "name": "thing" + "name": "thing", + "start": 17, + "end": 22 }, "key": { "type": "Identifier", diff --git a/test/parser/samples/await-catch/output.json b/test/parser/samples/await-catch/output.json index c543583018..91862b5366 100644 --- a/test/parser/samples/await-catch/output.json +++ b/test/parser/samples/await-catch/output.json @@ -26,10 +26,10 @@ }, "value": null, "error": { - "start": 47, - "end": 55, "type": "Identifier", - "name": "theError" + "name": "theError", + "start": 47, + "end": 55 }, "pending": { "start": 19, @@ -152,7 +152,8 @@ }, "name": "message" }, - "computed": false + "computed": false, + "optional": false } } ] diff --git a/test/parser/samples/await-then-catch/output.json b/test/parser/samples/await-then-catch/output.json index 8e4b7a4c32..e377d3fa3e 100644 --- a/test/parser/samples/await-then-catch/output.json +++ b/test/parser/samples/await-then-catch/output.json @@ -25,16 +25,16 @@ "name": "thePromise" }, "value": { - "start": 46, - "end": 54, "type": "Identifier", - "name": "theValue" + "name": "theValue", + "start": 46, + "end": 54 }, "error": { - "start": 96, - "end": 104, "type": "Identifier", - "name": "theError" + "name": "theError", + "start": 96, + "end": 104 }, "pending": { "start": 19, @@ -209,7 +209,8 @@ }, "name": "message" }, - "computed": false + "computed": false, + "optional": false } } ] diff --git a/test/parser/samples/dynamic-import/output.json b/test/parser/samples/dynamic-import/output.json index 1e41252afa..ed3d58782d 100644 --- a/test/parser/samples/dynamic-import/output.json +++ b/test/parser/samples/dynamic-import/output.json @@ -275,7 +275,8 @@ }, "name": "then" }, - "computed": false + "computed": false, + "optional": false }, "arguments": [ { @@ -403,7 +404,8 @@ }, "name": "log" }, - "computed": false + "computed": false, + "optional": false }, "arguments": [ { @@ -452,21 +454,25 @@ }, "name": "default" }, - "computed": false + "computed": false, + "optional": false } - ] + ], + "optional": false } } ] } } - ] + ], + "optional": false } } ] } } - ] + ], + "optional": false } } ], diff --git a/test/parser/samples/each-block-else/output.json b/test/parser/samples/each-block-else/output.json index 2720ce5292..622789d177 100644 --- a/test/parser/samples/each-block-else/output.json +++ b/test/parser/samples/each-block-else/output.json @@ -57,10 +57,10 @@ } ], "context": { - "start": 18, - "end": 24, "type": "Identifier", - "name": "animal" + "name": "animal", + "start": 18, + "end": 24 }, "else": { "start": 50, diff --git a/test/parser/samples/each-block-indexed/output.json b/test/parser/samples/each-block-indexed/output.json index 50f2000a36..01b97ffcb4 100644 --- a/test/parser/samples/each-block-indexed/output.json +++ b/test/parser/samples/each-block-indexed/output.json @@ -85,10 +85,10 @@ } ], "context": { - "start": 18, - "end": 24, "type": "Identifier", - "name": "animal" + "name": "animal", + "start": 18, + "end": 24 }, "index": "i" } diff --git a/test/parser/samples/each-block-keyed/output.json b/test/parser/samples/each-block-keyed/output.json index 7dc8681453..6eaf19a82d 100644 --- a/test/parser/samples/each-block-keyed/output.json +++ b/test/parser/samples/each-block-keyed/output.json @@ -57,10 +57,10 @@ } ], "context": { - "start": 16, - "end": 20, "type": "Identifier", - "name": "todo" + "name": "todo", + "start": 16, + "end": 20 }, "key": { "type": "MemberExpression", @@ -108,7 +108,8 @@ }, "name": "id" }, - "computed": false + "computed": false, + "optional": false } } ] diff --git a/test/parser/samples/each-block/output.json b/test/parser/samples/each-block/output.json index 6594fb50a6..82d4455d19 100644 --- a/test/parser/samples/each-block/output.json +++ b/test/parser/samples/each-block/output.json @@ -57,10 +57,10 @@ } ], "context": { - "start": 18, - "end": 24, "type": "Identifier", - "name": "animal" + "name": "animal", + "start": 18, + "end": 24 } } ] diff --git a/test/parser/samples/error-css-global-without-selector/error.json b/test/parser/samples/error-css-global-without-selector/error.json new file mode 100644 index 0000000000..f4237c65d3 --- /dev/null +++ b/test/parser/samples/error-css-global-without-selector/error.json @@ -0,0 +1,10 @@ +{ + "code": "css-syntax-error", + "message": ":global() must contain a selector", + "start": { + "line": 2, + "column": 1, + "character": 9 + }, + "pos": 9 +} diff --git a/test/parser/samples/error-css-global-without-selector/input.svelte b/test/parser/samples/error-css-global-without-selector/input.svelte new file mode 100644 index 0000000000..a626136cfc --- /dev/null +++ b/test/parser/samples/error-css-global-without-selector/input.svelte @@ -0,0 +1,3 @@ + diff --git a/test/parser/samples/error-unmatched-closing-tag-autoclose-2/error.json b/test/parser/samples/error-unmatched-closing-tag-autoclose-2/error.json new file mode 100644 index 0000000000..d24296bd96 --- /dev/null +++ b/test/parser/samples/error-unmatched-closing-tag-autoclose-2/error.json @@ -0,0 +1,10 @@ +{ + "code": "invalid-closing-tag", + "message": "

attempted to close an element that was not open", + "pos": 38, + "start": { + "character": 38, + "column": 0, + "line": 5 + } +} diff --git a/test/parser/samples/error-unmatched-closing-tag-autoclose-2/input.svelte b/test/parser/samples/error-unmatched-closing-tag-autoclose-2/input.svelte new file mode 100644 index 0000000000..5182577921 --- /dev/null +++ b/test/parser/samples/error-unmatched-closing-tag-autoclose-2/input.svelte @@ -0,0 +1,5 @@ +
+

+

pre tag
+
+

\ No newline at end of file diff --git a/test/parser/samples/error-unmatched-closing-tag-autoclose/error.json b/test/parser/samples/error-unmatched-closing-tag-autoclose/error.json new file mode 100644 index 0000000000..e6532d747e --- /dev/null +++ b/test/parser/samples/error-unmatched-closing-tag-autoclose/error.json @@ -0,0 +1,10 @@ +{ + "code": "invalid-closing-tag", + "message": "

attempted to close

that was already automatically closed by

",
+	"pos": 24,
+	"start": {
+		"character": 24,
+		"column": 0,
+		"line": 3
+	}
+}
diff --git a/test/parser/samples/error-unmatched-closing-tag-autoclose/input.svelte b/test/parser/samples/error-unmatched-closing-tag-autoclose/input.svelte
new file mode 100644
index 0000000000..0bfd609736
--- /dev/null
+++ b/test/parser/samples/error-unmatched-closing-tag-autoclose/input.svelte
@@ -0,0 +1,3 @@
+

+

pre tag
+

\ No newline at end of file diff --git a/test/parser/samples/no-error-if-before-closing/output.json b/test/parser/samples/no-error-if-before-closing/output.json index 708128a42e..f22586b267 100644 --- a/test/parser/samples/no-error-if-before-closing/output.json +++ b/test/parser/samples/no-error-if-before-closing/output.json @@ -116,10 +116,10 @@ "raw": "true" }, "value": { - "start": 97, - "end": 98, "type": "Identifier", - "name": "f" + "name": "f", + "start": 97, + "end": 98 }, "error": null, "pending": { @@ -204,10 +204,10 @@ "raw": "true" }, "value": { - "start": 137, - "end": 138, "type": "Identifier", - "name": "f" + "name": "f", + "start": 137, + "end": 138 }, "error": null, "pending": { diff --git a/test/parser/samples/unusual-identifier/output.json b/test/parser/samples/unusual-identifier/output.json index 76cc82cfd6..3d209d35fe 100644 --- a/test/parser/samples/unusual-identifier/output.json +++ b/test/parser/samples/unusual-identifier/output.json @@ -57,10 +57,10 @@ } ], "context": { - "start": 17, - "end": 19, "type": "Identifier", - "name": "𐊧" + "name": "𐊧", + "start": 17, + "end": 19 } } ] diff --git a/test/preprocess/samples/comments/_config.js b/test/preprocess/samples/comments/_config.js index 4416d121d0..fdec377567 100644 --- a/test/preprocess/samples/comments/_config.js +++ b/test/preprocess/samples/comments/_config.js @@ -2,7 +2,7 @@ export default { preprocess: [ { script: ({ content }) => ({ code: content.replace(/one/g, 'two') }), - style: ({ content }) => ({ code: content.replace(/one/g, 'three') }), - }, - ], + style: ({ content }) => ({ code: content.replace(/one/g, 'three') }) + } + ] }; diff --git a/test/preprocess/samples/script-self-closing/_config.js b/test/preprocess/samples/script-self-closing/_config.js new file mode 100644 index 0000000000..4baab9730e --- /dev/null +++ b/test/preprocess/samples/script-self-closing/_config.js @@ -0,0 +1,12 @@ +import * as assert from "assert"; + +export default { + preprocess: { + script: ({ content, attributes }) => { + assert.equal(content, ""); + return { + code: `console.log("${attributes["the-answer"]}");` + }; + } + } +}; diff --git a/test/preprocess/samples/script-self-closing/input.svelte b/test/preprocess/samples/script-self-closing/input.svelte new file mode 100644 index 0000000000..c5816cb3ba --- /dev/null +++ b/test/preprocess/samples/script-self-closing/input.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/preprocess/samples/style-self-closing/_config.js b/test/preprocess/samples/style-self-closing/_config.js new file mode 100644 index 0000000000..0a05cd3d64 --- /dev/null +++ b/test/preprocess/samples/style-self-closing/_config.js @@ -0,0 +1,12 @@ +import * as assert from "assert"; + +export default { + preprocess: { + style: ({ content, attributes: { color } }) => { + assert.equal(content, ""); + return { + code: `div { color: ${color}; }` + }; + } + } +}; diff --git a/test/preprocess/samples/style-self-closing/input.svelte b/test/preprocess/samples/style-self-closing/input.svelte new file mode 100644 index 0000000000..07176c87e5 --- /dev/null +++ b/test/preprocess/samples/style-self-closing/input.svelte @@ -0,0 +1,3 @@ +
$brand
+ + \ No newline at end of file diff --git a/test/runtime/index.js b/test/runtime/index.js index f070eb8185..65157196c9 100644 --- a/test/runtime/index.js +++ b/test/runtime/index.js @@ -39,7 +39,7 @@ describe("runtime", () => { filename }, compileOptions); - const { js: { code } } = compile(fs.readFileSync(filename, "utf-8"), options); + const { js: { code } } = compile(fs.readFileSync(filename, "utf-8").replace(/\r/g, ""), options); return module._compile(code, filename); }; @@ -103,7 +103,7 @@ describe("runtime", () => { try { const { js } = compile( - fs.readFileSync(`${cwd}/${file}`, 'utf-8'), + fs.readFileSync(`${cwd}/${file}`, 'utf-8').replace(/\r/g, ""), { ...compileOptions, filename: file diff --git a/test/runtime/samples/$$rest-without-props/_config.js b/test/runtime/samples/$$rest-without-props/_config.js index 017f9df561..1fb8e85a6a 100644 --- a/test/runtime/samples/$$rest-without-props/_config.js +++ b/test/runtime/samples/$$rest-without-props/_config.js @@ -11,7 +11,7 @@ export default {
`, - async test({ assert, target, window, }) { + async test({ assert, target, window }) { const [btn1, btn2, btn3, btn4] = target.querySelectorAll('button'); const clickEvent = new window.MouseEvent('click'); diff --git a/test/runtime/samples/$$rest/_config.js b/test/runtime/samples/$$rest/_config.js index 255927f354..f00c26d712 100644 --- a/test/runtime/samples/$$rest/_config.js +++ b/test/runtime/samples/$$rest/_config.js @@ -13,7 +13,7 @@ export default { `, - async test({ assert, target, window, }) { + async test({ assert, target, window }) { const [btn1, btn2, btn3, btn4] = target.querySelectorAll('button'); const clickEvent = new window.MouseEvent('click'); diff --git a/test/runtime/samples/$$slot/A.svelte b/test/runtime/samples/$$slot/A.svelte new file mode 100644 index 0000000000..ffa166166c --- /dev/null +++ b/test/runtime/samples/$$slot/A.svelte @@ -0,0 +1,31 @@ + + + + + +$$slots: {toString($$slots)} + +{#if $$slots.b} +
+ +
+{:else} + Slot b is not available +{/if} \ No newline at end of file diff --git a/test/runtime/samples/$$slot/_config.js b/test/runtime/samples/$$slot/_config.js new file mode 100644 index 0000000000..13b2137cdb --- /dev/null +++ b/test/runtime/samples/$$slot/_config.js @@ -0,0 +1,18 @@ +export default { + html: ` + byeworld + hello world + $$slots: {"a":true,"default":true} + Slot b is not available + + bye world + hello world + $$slots: {"a":true,"b":true,"default":true} +
hello world
+ `, + + async test({ assert, target, component }) { + assert.equal(component.getA(), ''); + assert.equal(component.getB(), 'foo'); + } +}; diff --git a/test/runtime/samples/$$slot/main.svelte b/test/runtime/samples/$$slot/main.svelte new file mode 100644 index 0000000000..8b7efae573 --- /dev/null +++ b/test/runtime/samples/$$slot/main.svelte @@ -0,0 +1,23 @@ + + +
+ hello world + bye + world + + + + hello world + hello world + bye world + diff --git a/test/runtime/samples/action-custom-event-handler-this/_config.js b/test/runtime/samples/action-custom-event-handler-this/_config.js index 88a30232ab..754f813c7f 100644 --- a/test/runtime/samples/action-custom-event-handler-this/_config.js +++ b/test/runtime/samples/action-custom-event-handler-this/_config.js @@ -18,5 +18,5 @@ export default { input.dispatchEvent(event); assert.ok(blurred); - }, + } }; diff --git a/test/runtime/samples/action-ternary-template/_config.js b/test/runtime/samples/action-ternary-template/_config.js index adf23a9f68..ecb18dceec 100644 --- a/test/runtime/samples/action-ternary-template/_config.js +++ b/test/runtime/samples/action-ternary-template/_config.js @@ -1,7 +1,7 @@ export default { props: { target: 'World!', - display: true, + display: true }, html: ` @@ -16,5 +16,5 @@ export default { assert.htmlEqual(target.innerHTML, `

Hello World!

`); - }, + } }; diff --git a/test/runtime/samples/action-this/_config.js b/test/runtime/samples/action-this/_config.js index de7f834cdc..c59ff3b634 100644 --- a/test/runtime/samples/action-this/_config.js +++ b/test/runtime/samples/action-this/_config.js @@ -7,5 +7,5 @@ export default { await button.dispatchEvent(click); await Promise.resolve(); assert.htmlEqual(target.innerHTML, ``); - }, + } }; diff --git a/test/runtime/samples/apply-directives-in-order-2/_config.js b/test/runtime/samples/apply-directives-in-order-2/_config.js index a74ce41cb6..caff97a5b9 100644 --- a/test/runtime/samples/apply-directives-in-order-2/_config.js +++ b/test/runtime/samples/apply-directives-in-order-2/_config.js @@ -1,7 +1,7 @@ const value = []; export default { props: { - value, + value }, async test({ assert, component, target, window }) { @@ -32,7 +32,7 @@ export default { '15', '16', '17', - '18', + '18' ]); - }, + } }; diff --git a/test/runtime/samples/apply-directives-in-order/_config.js b/test/runtime/samples/apply-directives-in-order/_config.js index e5e8980ed1..7c8f87ef85 100644 --- a/test/runtime/samples/apply-directives-in-order/_config.js +++ b/test/runtime/samples/apply-directives-in-order/_config.js @@ -33,5 +33,5 @@ export default {

HE

`); - }, + } }; diff --git a/test/runtime/samples/attribute-boolean-false/_config.js b/test/runtime/samples/attribute-boolean-false/_config.js index 14fdeb9fdc..e47c5e7df1 100644 --- a/test/runtime/samples/attribute-boolean-false/_config.js +++ b/test/runtime/samples/attribute-boolean-false/_config.js @@ -3,5 +3,5 @@ export default { test({ assert, component, target }) { const textarea = target.querySelector('textarea'); assert.ok(textarea.readOnly === false); - }, + } }; diff --git a/test/runtime/samples/attribute-boolean-true/_config.js b/test/runtime/samples/attribute-boolean-true/_config.js index 0e402ed1e3..1f77e33027 100644 --- a/test/runtime/samples/attribute-boolean-true/_config.js +++ b/test/runtime/samples/attribute-boolean-true/_config.js @@ -3,5 +3,5 @@ export default { test({ assert, component, target }) { const textarea = target.querySelector('textarea'); assert.ok(textarea.readOnly); - }, + } }; diff --git a/test/runtime/samples/attribute-dataset-without-value/_config.js b/test/runtime/samples/attribute-dataset-without-value/_config.js index 934f44eb06..21e60b92aa 100644 --- a/test/runtime/samples/attribute-dataset-without-value/_config.js +++ b/test/runtime/samples/attribute-dataset-without-value/_config.js @@ -1,3 +1,3 @@ export default { - html: '
', + html: '
' }; diff --git a/test/runtime/samples/attribute-dynamic-no-dependencies/_config.js b/test/runtime/samples/attribute-dynamic-no-dependencies/_config.js index acf3c64bdd..f1088830af 100644 --- a/test/runtime/samples/attribute-dynamic-no-dependencies/_config.js +++ b/test/runtime/samples/attribute-dynamic-no-dependencies/_config.js @@ -1,5 +1,5 @@ export default { html: `
bar
- `, + ` }; diff --git a/test/runtime/samples/attribute-false/_config.js b/test/runtime/samples/attribute-false/_config.js index 9fd08a2a48..632d4ac1c2 100644 --- a/test/runtime/samples/attribute-false/_config.js +++ b/test/runtime/samples/attribute-false/_config.js @@ -1,3 +1,3 @@ export default { - html: `
`, + html: `
` }; diff --git a/test/runtime/samples/attribute-null-classnames-no-style/_config.js b/test/runtime/samples/attribute-null-classnames-no-style/_config.js index 917cf565c0..e90d81a60f 100644 --- a/test/runtime/samples/attribute-null-classnames-no-style/_config.js +++ b/test/runtime/samples/attribute-null-classnames-no-style/_config.js @@ -1,7 +1,7 @@ export default { props: { testName1: "test1", - testName2: "test2", + testName2: "test2" }, html: `
`, diff --git a/test/runtime/samples/attribute-null-classnames-with-style/_config.js b/test/runtime/samples/attribute-null-classnames-with-style/_config.js index 5762f628fb..20e6d4c7be 100644 --- a/test/runtime/samples/attribute-null-classnames-with-style/_config.js +++ b/test/runtime/samples/attribute-null-classnames-with-style/_config.js @@ -1,7 +1,7 @@ export default { props: { testName1: "test1", - testName2: "test2", + testName2: "test2" }, html: `
`, diff --git a/test/runtime/samples/attribute-null-func-classnames-no-style/_config.js b/test/runtime/samples/attribute-null-func-classnames-no-style/_config.js index 917cf565c0..e90d81a60f 100644 --- a/test/runtime/samples/attribute-null-func-classnames-no-style/_config.js +++ b/test/runtime/samples/attribute-null-func-classnames-no-style/_config.js @@ -1,7 +1,7 @@ export default { props: { testName1: "test1", - testName2: "test2", + testName2: "test2" }, html: `
`, diff --git a/test/runtime/samples/attribute-null-func-classnames-with-style/_config.js b/test/runtime/samples/attribute-null-func-classnames-with-style/_config.js index 5762f628fb..20e6d4c7be 100644 --- a/test/runtime/samples/attribute-null-func-classnames-with-style/_config.js +++ b/test/runtime/samples/attribute-null-func-classnames-with-style/_config.js @@ -1,7 +1,7 @@ export default { props: { testName1: "test1", - testName2: "test2", + testName2: "test2" }, html: `
`, diff --git a/test/runtime/samples/attribute-null/_config.js b/test/runtime/samples/attribute-null/_config.js index ae2f0a8af6..36955050a0 100644 --- a/test/runtime/samples/attribute-null/_config.js +++ b/test/runtime/samples/attribute-null/_config.js @@ -1,3 +1,3 @@ export default { - html: `
`, + html: `
` }; diff --git a/test/runtime/samples/attribute-prefer-expression/_config.js b/test/runtime/samples/attribute-prefer-expression/_config.js index 29fcbc7f13..2388ff35df 100644 --- a/test/runtime/samples/attribute-prefer-expression/_config.js +++ b/test/runtime/samples/attribute-prefer-expression/_config.js @@ -2,7 +2,7 @@ export default { skip_if_ssr: true, props: { - foo: false, + foo: false }, test({ assert, component, target }) { @@ -15,5 +15,5 @@ export default { assert.ok(!inputs[0].checked); assert.ok(inputs[1].checked); - }, + } }; diff --git a/test/runtime/samples/attribute-undefined/_config.js b/test/runtime/samples/attribute-undefined/_config.js index ae2f0a8af6..36955050a0 100644 --- a/test/runtime/samples/attribute-undefined/_config.js +++ b/test/runtime/samples/attribute-undefined/_config.js @@ -1,3 +1,3 @@ export default { - html: `
`, + html: `
` }; diff --git a/test/runtime/samples/await-with-update-2/Component.svelte b/test/runtime/samples/await-with-update-2/Component.svelte new file mode 100644 index 0000000000..1301db3f99 --- /dev/null +++ b/test/runtime/samples/await-with-update-2/Component.svelte @@ -0,0 +1,7 @@ + + +
count: {count}
+
value: {value}
\ No newline at end of file diff --git a/test/runtime/samples/await-with-update-2/_config.js b/test/runtime/samples/await-with-update-2/_config.js new file mode 100644 index 0000000000..613f2b3255 --- /dev/null +++ b/test/runtime/samples/await-with-update-2/_config.js @@ -0,0 +1,64 @@ +export default { + props: { + thePromise: new Promise((_) => {}), + count: 0 + }, + + html: ` +

loading...

+ `, + + async test({ assert, component, target }) { + await (component.thePromise = Promise.resolve({ value: "success", Component: component.Component })); + + assert.htmlEqual( + target.innerHTML, + ` +
Resolved: +
count: 0
+
value: success
+
+ ` + ); + + component.count = 5; + + assert.htmlEqual( + target.innerHTML, + ` +
Resolved: +
count: 5
+
value: success
+
+ ` + ); + + try { + await (component.thePromise = Promise.reject({ value: "failure", Component: component.Component })); + } catch (error) { + // ignore + } + + assert.htmlEqual( + target.innerHTML, + ` +
Rejected: +
count: 5
+
value: failure
+
+ ` + ); + + component.count = 10; + + assert.htmlEqual( + target.innerHTML, + ` +
Rejected: +
count: 10
+
value: failure
+
+ ` + ); + } +}; diff --git a/test/runtime/samples/await-with-update-2/main.svelte b/test/runtime/samples/await-with-update-2/main.svelte new file mode 100644 index 0000000000..b29c875f92 --- /dev/null +++ b/test/runtime/samples/await-with-update-2/main.svelte @@ -0,0 +1,16 @@ + + +
+ {#await thePromise} +

loading...

+ {:then { value: theValue, Component }} + Resolved: + {:catch { value: theError, Component } } + Rejected: + {/await} +
\ No newline at end of file diff --git a/test/runtime/samples/await-with-update/Component.svelte b/test/runtime/samples/await-with-update/Component.svelte new file mode 100644 index 0000000000..5f13c80e65 --- /dev/null +++ b/test/runtime/samples/await-with-update/Component.svelte @@ -0,0 +1,5 @@ + + +
count: {count}
\ No newline at end of file diff --git a/test/runtime/samples/await-with-update/_config.js b/test/runtime/samples/await-with-update/_config.js new file mode 100644 index 0000000000..08bf12b89e --- /dev/null +++ b/test/runtime/samples/await-with-update/_config.js @@ -0,0 +1,60 @@ +export default { + props: { + thePromise: new Promise((_) => {}), + count: 0 + }, + + html: ` +

loading...

+ `, + + async test({ assert, component, target }) { + await (component.thePromise = Promise.resolve(component.Component)); + + assert.htmlEqual( + target.innerHTML, + ` +
Resolved: +
count: 0
+
+ ` + ); + + component.count = 5; + + assert.htmlEqual( + target.innerHTML, + ` +
Resolved: +
count: 5
+
+ ` + ); + + try { + await (component.thePromise = Promise.reject(component.Component)); + } catch (error) { + // ignore + } + + assert.htmlEqual( + target.innerHTML, + ` +
Rejected: +
count: 5
+
+ ` + ); + + component.count = 10; + + assert.htmlEqual( + target.innerHTML, + ` +
Rejected: +
count: 10
+
+ ` + ); + } +}; diff --git a/test/runtime/samples/await-with-update/main.svelte b/test/runtime/samples/await-with-update/main.svelte new file mode 100644 index 0000000000..51c5b76a21 --- /dev/null +++ b/test/runtime/samples/await-with-update/main.svelte @@ -0,0 +1,16 @@ + + +
+ {#await thePromise} +

loading...

+ {:then theValue} + Resolved: + {:catch theError} + Rejected: + {/await} +
\ No newline at end of file diff --git a/test/runtime/samples/await-without-catch/_config.js b/test/runtime/samples/await-without-catch/_config.js new file mode 100644 index 0000000000..2030ed7949 --- /dev/null +++ b/test/runtime/samples/await-without-catch/_config.js @@ -0,0 +1,44 @@ +let fulfil; + +let promise = new Promise(f => { + fulfil = f; +}); + +export default { + props: { + promise + }, + + html: ` +

loading...

+ `, + + test({ assert, component, target }) { + fulfil(42); + + return promise + .then(() => { + assert.htmlEqual(target.innerHTML, ` +

loaded

+ `); + + let reject; + + promise = new Promise((f, r) => { + reject = r; + }); + + component.promise = promise; + + assert.htmlEqual(target.innerHTML, ` +

loading...

+ `); + + reject(new Error('this error should be thrown')); + return promise; + }) + .catch((err) => { + assert.equal(err.message, 'this error should be thrown'); + }); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/await-without-catch/main.svelte b/test/runtime/samples/await-without-catch/main.svelte new file mode 100644 index 0000000000..f528a8bf69 --- /dev/null +++ b/test/runtime/samples/await-without-catch/main.svelte @@ -0,0 +1,9 @@ + + +{#await promise} +

loading...

+{:then value} +

loaded

+{/await} \ No newline at end of file diff --git a/test/runtime/samples/binding-contenteditable-html-initial/_config.js b/test/runtime/samples/binding-contenteditable-html-initial/_config.js index 9eac2c9b17..4c30a3231a 100644 --- a/test/runtime/samples/binding-contenteditable-html-initial/_config.js +++ b/test/runtime/samples/binding-contenteditable-html-initial/_config.js @@ -36,5 +36,5 @@ export default { goodbye

hello goodbye

`); - }, + } }; diff --git a/test/runtime/samples/binding-contenteditable-html/_config.js b/test/runtime/samples/binding-contenteditable-html/_config.js index ceb6a75c70..639572faea 100644 --- a/test/runtime/samples/binding-contenteditable-html/_config.js +++ b/test/runtime/samples/binding-contenteditable-html/_config.js @@ -1,6 +1,6 @@ export default { props: { - name: 'world', + name: 'world' }, html: ` @@ -34,5 +34,5 @@ export default { goodbye

hello goodbye

`); - }, + } }; diff --git a/test/runtime/samples/binding-contenteditable-text-initial/_config.js b/test/runtime/samples/binding-contenteditable-text-initial/_config.js index 4899f30f12..d5f331bb7a 100644 --- a/test/runtime/samples/binding-contenteditable-text-initial/_config.js +++ b/test/runtime/samples/binding-contenteditable-text-initial/_config.js @@ -30,5 +30,5 @@ export default { goodbye

hello goodbye

`); - }, + } }; diff --git a/test/runtime/samples/binding-contenteditable-text/_config.js b/test/runtime/samples/binding-contenteditable-text/_config.js index 9f8645724d..89f3968258 100644 --- a/test/runtime/samples/binding-contenteditable-text/_config.js +++ b/test/runtime/samples/binding-contenteditable-text/_config.js @@ -1,6 +1,6 @@ export default { props: { - name: 'world', + name: 'world' }, html: ` @@ -28,5 +28,5 @@ export default { goodbye

hello goodbye

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-checkbox-indeterminate/_config.js b/test/runtime/samples/binding-input-checkbox-indeterminate/_config.js index 2e3a1c296f..9d099feb0a 100644 --- a/test/runtime/samples/binding-input-checkbox-indeterminate/_config.js +++ b/test/runtime/samples/binding-input-checkbox-indeterminate/_config.js @@ -2,7 +2,7 @@ export default { skip_if_ssr: true, props: { - indeterminate: true, + indeterminate: true }, html: ` @@ -38,5 +38,5 @@ export default {

checked? true

indeterminate? true

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js b/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js index b502ed40af..9e6f915dd0 100644 --- a/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js +++ b/test/runtime/samples/binding-input-checkbox-with-event-in-each/_config.js @@ -3,13 +3,13 @@ export default { cats: [ { name: "cat 0", - checked: false, + checked: false }, { name: "cat 1", - checked: false, - }, - ], + checked: false + } + ] }, html: ` @@ -22,7 +22,7 @@ export default { const newCats = cats.slice(); newCats.push({ name: "cat " + cats.length, - checked: false, + checked: false }); component.cats = newCats; diff --git a/test/runtime/samples/binding-input-group-duplicate-value/_config.js b/test/runtime/samples/binding-input-group-duplicate-value/_config.js new file mode 100644 index 0000000000..7f50ad6dce --- /dev/null +++ b/test/runtime/samples/binding-input-group-duplicate-value/_config.js @@ -0,0 +1,81 @@ +export default { + html: ` +

Checked:

+ +
+ + a
+ b
+ c
+ d
+ +
+ + a
+ b
+ c
+ d
+ `, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll("input"); + const p = target.querySelector("p"); + + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, false); + + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + + const event = new window.Event("change"); + + inputs[0].checked = true; + await inputs[0].dispatchEvent(event); + + assert.htmlEqual(p.innerHTML, `Checked: a`); + + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, false); + + assert.equal(inputs[4].checked, true); + assert.equal(inputs[5].checked, false); + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + + inputs[3].checked = true; + await inputs[3].dispatchEvent(event); + + assert.htmlEqual(p.innerHTML, `Checked: a,d`); + + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, true); + + assert.equal(inputs[4].checked, true); + assert.equal(inputs[5].checked, false); + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, true); + + inputs[4].checked = false; + await inputs[4].dispatchEvent(event); + + assert.htmlEqual(p.innerHTML, `Checked: d`); + + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, true); + + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, true); + } +}; diff --git a/test/runtime/samples/binding-input-group-duplicate-value/main.svelte b/test/runtime/samples/binding-input-group-duplicate-value/main.svelte new file mode 100644 index 0000000000..153e559d23 --- /dev/null +++ b/test/runtime/samples/binding-input-group-duplicate-value/main.svelte @@ -0,0 +1,19 @@ + + +

Checked: {foo}

+ +
+ +a
+b
+c
+d
+ +
+ +a
+b
+c
+d
\ No newline at end of file diff --git a/test/runtime/samples/binding-input-group-each-1/_config.js b/test/runtime/samples/binding-input-group-each-1/_config.js new file mode 100644 index 0000000000..92010296dc --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-1/_config.js @@ -0,0 +1,275 @@ +const values = [ + { name: 'Alpha' }, + { name: 'Beta' }, + { name: 'Gamma' } +]; + +const selected_array = [ + [values[1]], + [], + [values[2]] +]; + +export default { + props: { + values, + selected_array + }, + + html: ` +
+ + + + + + +

Beta

+
+
+ + + + + + +

+
+
+ + + + + + +

Gamma

+
+ `, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, true); + + const event = new window.Event('change'); + + inputs[0].checked = true; + await inputs[0].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Alpha, Beta

+
+
+ + + + + + +

+
+
+ + + + + + +

Gamma

+
+ `); + inputs[3].checked = true; + await inputs[3].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Alpha, Beta

+
+
+ + + + + + +

Alpha

+
+
+ + + + + + +

Gamma

+
+ `); + + inputs[8].checked = false; + await inputs[8].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Alpha, Beta

+
+
+ + + + + + +

Alpha

+
+
+ + + + + + +

+
+ `); + + component.selected_array = [[values[1], values[2]], [values[2]]]; + + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, true); + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, true); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Beta, Gamma

+
+
+ + + + + + +

Gamma

+
+ `); + } +}; diff --git a/test/runtime/samples/binding-input-group-each-1/main.svelte b/test/runtime/samples/binding-input-group-each-1/main.svelte new file mode 100644 index 0000000000..5ed255c83a --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-1/main.svelte @@ -0,0 +1,15 @@ + + +{#each selected_array as selected} +
+ {#each values as value} + + {/each} +

{selected.map(v => v.name).join(', ')}

+
+{/each} diff --git a/test/runtime/samples/binding-input-group-each-2/_config.js b/test/runtime/samples/binding-input-group-each-2/_config.js new file mode 100644 index 0000000000..78d692d979 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-2/_config.js @@ -0,0 +1,59 @@ +export default { + html: ` + + + + +

1, 2, 3

`, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, true); + + const event = new window.Event('change'); + + inputs[0].checked = false; + await inputs[0].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + + +

2, 3

+ `); + + component.selected = [[1, 3]]; + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, true); + + assert.htmlEqual(target.innerHTML, ` + + + + +

1, 3

+ `); + } +}; diff --git a/test/runtime/samples/binding-input-group-each-2/main.svelte b/test/runtime/samples/binding-input-group-each-2/main.svelte new file mode 100644 index 0000000000..46f7e9e698 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-2/main.svelte @@ -0,0 +1,17 @@ + + +{#each options as value} + +{/each} + +

{selected[0].join(', ')}

\ No newline at end of file diff --git a/test/runtime/samples/binding-input-group-each-3/_config.js b/test/runtime/samples/binding-input-group-each-3/_config.js new file mode 100644 index 0000000000..92010296dc --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-3/_config.js @@ -0,0 +1,275 @@ +const values = [ + { name: 'Alpha' }, + { name: 'Beta' }, + { name: 'Gamma' } +]; + +const selected_array = [ + [values[1]], + [], + [values[2]] +]; + +export default { + props: { + values, + selected_array + }, + + html: ` +
+ + + + + + +

Beta

+
+
+ + + + + + +

+
+
+ + + + + + +

Gamma

+
+ `, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, false); + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, true); + + const event = new window.Event('change'); + + inputs[0].checked = true; + await inputs[0].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Alpha, Beta

+
+
+ + + + + + +

+
+
+ + + + + + +

Gamma

+
+ `); + inputs[3].checked = true; + await inputs[3].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Alpha, Beta

+
+
+ + + + + + +

Alpha

+
+
+ + + + + + +

Gamma

+
+ `); + + inputs[8].checked = false; + await inputs[8].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Alpha, Beta

+
+
+ + + + + + +

Alpha

+
+
+ + + + + + +

+
+ `); + + component.selected_array = [[values[1], values[2]], [values[2]]]; + + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, true); + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, true); + + assert.htmlEqual(target.innerHTML, ` +
+ + + + + + +

Beta, Gamma

+
+
+ + + + + + +

Gamma

+
+ `); + } +}; diff --git a/test/runtime/samples/binding-input-group-each-3/main.svelte b/test/runtime/samples/binding-input-group-each-3/main.svelte new file mode 100644 index 0000000000..42a7a1c4e9 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-3/main.svelte @@ -0,0 +1,15 @@ + + +{#each selected_array as _, index} +
+ {#each values as value} + + {/each} +

{selected_array[index].map(v => v.name).join(', ')}

+
+{/each} diff --git a/test/runtime/samples/binding-input-group-each-4/_config.js b/test/runtime/samples/binding-input-group-each-4/_config.js new file mode 100644 index 0000000000..f1168858b0 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-4/_config.js @@ -0,0 +1,153 @@ +export default { + html: ` + + + +

1

+ + + +

2

+ + + +

+ + + +

3

+ `, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, true); + assert.equal(inputs[5].checked, false); + + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, false); + + assert.equal(inputs[9].checked, false); + assert.equal(inputs[10].checked, false); + assert.equal(inputs[11].checked, true); + + const event = new window.Event('change'); + + inputs[2].checked = true; + await inputs[2].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 3

+ + + +

2

+ + + +

+ + + +

3

+ `); + + inputs[9].checked = true; + await inputs[9].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 3

+ + + +

2

+ + + +

+ + + +

1, 3

+ `); + + inputs[4].checked = false; + await inputs[4].dispatchEvent(event); + inputs[5].checked = true; + await inputs[5].dispatchEvent(event); + inputs[6].checked = true; + await inputs[6].dispatchEvent(event); + inputs[7].checked = true; + await inputs[7].dispatchEvent(event); + inputs[11].checked = false; + await inputs[11].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 3

+ + + +

3

+ + + +

1, 2

+ + + +

1

+ `); + + component.selected_array_1 = [[3], [1]]; + component.selected_array_2 = [[], [2]]; + + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, true); + + assert.equal(inputs[3].checked, true); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, false); + + assert.equal(inputs[9].checked, false); + assert.equal(inputs[10].checked, true); + assert.equal(inputs[11].checked, false); + + assert.htmlEqual(target.innerHTML, ` + + + +

3

+ + + +

1

+ + + +

+ + + +

2

+ `); + } +}; diff --git a/test/runtime/samples/binding-input-group-each-4/main.svelte b/test/runtime/samples/binding-input-group-each-4/main.svelte new file mode 100644 index 0000000000..0bbf5ea763 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-4/main.svelte @@ -0,0 +1,33 @@ + + +{#each selected_array_1 as selected} + {#each options as value} + + {/each} +

{selected.join(', ')}

+{/each} + +{#each selected_array_2 as selected} + {#each options as value} + + {/each} +

{selected.join(', ')}

+{/each} \ No newline at end of file diff --git a/test/runtime/samples/binding-input-group-each-5/_config.js b/test/runtime/samples/binding-input-group-each-5/_config.js new file mode 100644 index 0000000000..579225c627 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-5/_config.js @@ -0,0 +1,160 @@ +export default { + html: ` + + + +

1

+ + + +

1, 2, 3

+ + + +

2

+ + + +

1

+ `, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + + assert.equal(inputs[3].checked, true); + assert.equal(inputs[4].checked, true); + assert.equal(inputs[5].checked, true); + + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, true); + assert.equal(inputs[8].checked, false); + + assert.equal(inputs[9].checked, true); + assert.equal(inputs[10].checked, false); + assert.equal(inputs[11].checked, false); + + const event = new window.Event('change'); + + inputs[2].checked = true; + await inputs[2].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 3

+ + + +

1, 2, 3

+ + + +

2

+ + + +

1

+ `); + + inputs[8].checked = true; + await inputs[8].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 3

+ + + +

1, 2, 3

+ + + +

2, 3

+ + + +

1

+ `); + + component.selected_index = [1, 1]; + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 2, 3

+ + + +

1, 2, 3

+ + + +

1

+ + + +

1

+ `); + + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, true); + + assert.equal(inputs[3].checked, true); + assert.equal(inputs[4].checked, true); + assert.equal(inputs[5].checked, true); + + assert.equal(inputs[6].checked, true); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, false); + + assert.equal(inputs[9].checked, true); + assert.equal(inputs[10].checked, false); + assert.equal(inputs[11].checked, false); + + inputs[5].checked = false; + await inputs[5].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

1, 2

+ + + +

1, 2

+ + + +

1

+ + + +

1

+ `); + + assert.equal(inputs[0].checked, true); + assert.equal(inputs[1].checked, true); + assert.equal(inputs[2].checked, false); + + assert.equal(inputs[3].checked, true); + assert.equal(inputs[4].checked, true); + assert.equal(inputs[5].checked, false); + + assert.equal(inputs[6].checked, true); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, false); + + assert.equal(inputs[9].checked, true); + assert.equal(inputs[10].checked, false); + assert.equal(inputs[11].checked, false); + } +}; diff --git a/test/runtime/samples/binding-input-group-each-5/main.svelte b/test/runtime/samples/binding-input-group-each-5/main.svelte new file mode 100644 index 0000000000..93bdce6510 --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-5/main.svelte @@ -0,0 +1,24 @@ + + +{#each selected_array as selected} + {#each selected_index as index} + {#each options as value} + + {/each} +

{selected[index].join(', ')}

+ {/each} +{/each} diff --git a/test/runtime/samples/binding-input-group-each-6/_config.js b/test/runtime/samples/binding-input-group-each-6/_config.js new file mode 100644 index 0000000000..9eb251bf5d --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-6/_config.js @@ -0,0 +1,87 @@ +export default { + html: ` + + + +

+ + + +

+ + + +

+ `, + + async test({ assert, component, target, window }) { + const inputs = target.querySelectorAll('input'); + assert.equal(inputs[0].checked, false); + assert.equal(inputs[1].checked, false); + assert.equal(inputs[2].checked, false); + + assert.equal(inputs[3].checked, false); + assert.equal(inputs[4].checked, false); + assert.equal(inputs[5].checked, false); + + assert.equal(inputs[6].checked, false); + assert.equal(inputs[7].checked, false); + assert.equal(inputs[8].checked, false); + + const event = new window.Event('change'); + + inputs[2].checked = true; + await inputs[2].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

z

+ + + +

+ + + +

+ `); + + inputs[4].checked = true; + await inputs[4].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

z

+ + + +

y

+ + + +

+ `); + + inputs[5].checked = true; + await inputs[5].dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + + + +

z

+ + + +

y, z

+ + + +

+ `); + } +}; diff --git a/test/runtime/samples/binding-input-group-each-6/main.svelte b/test/runtime/samples/binding-input-group-each-6/main.svelte new file mode 100644 index 0000000000..85be939e8a --- /dev/null +++ b/test/runtime/samples/binding-input-group-each-6/main.svelte @@ -0,0 +1,22 @@ + + +{#each Object.keys(list) as key} + {#each values as value} + + {/each} +

{list[key].join(', ')}

+{/each} diff --git a/test/runtime/samples/binding-input-number-2/_config.js b/test/runtime/samples/binding-input-number-2/_config.js index a3510eb757..5daf50fd04 100644 --- a/test/runtime/samples/binding-input-number-2/_config.js +++ b/test/runtime/samples/binding-input-number-2/_config.js @@ -27,5 +27,5 @@ export default { component.value = 1; assert.equal(component.value, 1); assert.equal(input.value, "1"); - }, + } }; diff --git a/test/runtime/samples/binding-input-number/_config.js b/test/runtime/samples/binding-input-number/_config.js index 869b9f9896..3c5919bc64 100644 --- a/test/runtime/samples/binding-input-number/_config.js +++ b/test/runtime/samples/binding-input-number/_config.js @@ -1,6 +1,6 @@ export default { props: { - count: 42, + count: 42 }, html: ` @@ -44,5 +44,5 @@ export default {

undefined undefined

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-range-change-with-max/_config.js b/test/runtime/samples/binding-input-range-change-with-max/_config.js index 1fda90d83c..dc3cf4ce28 100644 --- a/test/runtime/samples/binding-input-range-change-with-max/_config.js +++ b/test/runtime/samples/binding-input-range-change-with-max/_config.js @@ -29,5 +29,5 @@ export default {

20 of 20

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-range-change/_config.js b/test/runtime/samples/binding-input-range-change/_config.js index 62e9562770..f6ec2d9c53 100644 --- a/test/runtime/samples/binding-input-range-change/_config.js +++ b/test/runtime/samples/binding-input-range-change/_config.js @@ -1,6 +1,6 @@ export default { props: { - count: 42, + count: 42 }, html: ` @@ -34,5 +34,5 @@ export default {

number 44

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-range/_config.js b/test/runtime/samples/binding-input-range/_config.js index 4c3d37a667..dc6178e088 100644 --- a/test/runtime/samples/binding-input-range/_config.js +++ b/test/runtime/samples/binding-input-range/_config.js @@ -1,6 +1,6 @@ export default { props: { - count: 42, + count: 42 }, html: ` @@ -34,5 +34,5 @@ export default {

number 44

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-contextual-deconflicted/_config.js b/test/runtime/samples/binding-input-text-contextual-deconflicted/_config.js index 28cffdfa57..de4d6325b0 100644 --- a/test/runtime/samples/binding-input-text-contextual-deconflicted/_config.js +++ b/test/runtime/samples/binding-input-text-contextual-deconflicted/_config.js @@ -1,7 +1,7 @@ export default { props: { foo: 'a', - items: ['x'], + items: ['x'] }, html: ` @@ -32,5 +32,5 @@ export default {

b

y

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-contextual-reactive/_config.js b/test/runtime/samples/binding-input-text-contextual-reactive/_config.js index 6fdfc4be52..a1584c18b8 100644 --- a/test/runtime/samples/binding-input-text-contextual-reactive/_config.js +++ b/test/runtime/samples/binding-input-text-contextual-reactive/_config.js @@ -121,5 +121,5 @@ export default {

done:one / done:two / remaining:four

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-contextual/_config.js b/test/runtime/samples/binding-input-text-contextual/_config.js index bb7f16c8bb..1c66ea7ff5 100644 --- a/test/runtime/samples/binding-input-text-contextual/_config.js +++ b/test/runtime/samples/binding-input-text-contextual/_config.js @@ -1,6 +1,6 @@ export default { props: { - items: ['one', 'two', 'three'], + items: ['one', 'two', 'three'] }, html: ` @@ -65,5 +65,5 @@ export default {

five

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-deconflicted/_config.js b/test/runtime/samples/binding-input-text-deconflicted/_config.js index 46fe3e2a38..48a7d2590a 100644 --- a/test/runtime/samples/binding-input-text-deconflicted/_config.js +++ b/test/runtime/samples/binding-input-text-deconflicted/_config.js @@ -1,8 +1,8 @@ export default { props: { component: { - name: 'world', - }, + name: 'world' + } }, html: ` @@ -36,5 +36,5 @@ export default {

Hello goodbye!

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-deep-computed-dynamic/_config.js b/test/runtime/samples/binding-input-text-deep-computed-dynamic/_config.js index eeecdb0ef8..0afbb9d952 100644 --- a/test/runtime/samples/binding-input-text-deep-computed-dynamic/_config.js +++ b/test/runtime/samples/binding-input-text-deep-computed-dynamic/_config.js @@ -4,8 +4,8 @@ export default { obj: { foo: 'a', bar: 'b', - baz: 'c', - }, + baz: 'c' + } }, html: ` @@ -56,5 +56,5 @@ export default {
{"foo":"d","bar":"e","baz":"f"}
`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-deep-computed/_config.js b/test/runtime/samples/binding-input-text-deep-computed/_config.js index a1ea2c34ad..3a85d50d76 100644 --- a/test/runtime/samples/binding-input-text-deep-computed/_config.js +++ b/test/runtime/samples/binding-input-text-deep-computed/_config.js @@ -2,8 +2,8 @@ export default { props: { prop: 'name', user: { - name: 'alice', - }, + name: 'alice' + } }, html: ` @@ -40,5 +40,5 @@ export default {

hello carol

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-deep-contextual-computed-dynamic/_config.js b/test/runtime/samples/binding-input-text-deep-contextual-computed-dynamic/_config.js index 364195233d..627ef5f15e 100644 --- a/test/runtime/samples/binding-input-text-deep-contextual-computed-dynamic/_config.js +++ b/test/runtime/samples/binding-input-text-deep-contextual-computed-dynamic/_config.js @@ -5,9 +5,9 @@ export default { { foo: 'a', bar: 'b', - baz: 'c', - }, - ], + baz: 'c' + } + ] }, html: ` @@ -58,5 +58,5 @@ export default {
{"foo":"d","bar":"e","baz":"f"}
`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-deep-contextual/_config.js b/test/runtime/samples/binding-input-text-deep-contextual/_config.js index 5b6b0d6577..cc80d38042 100644 --- a/test/runtime/samples/binding-input-text-deep-contextual/_config.js +++ b/test/runtime/samples/binding-input-text-deep-contextual/_config.js @@ -3,8 +3,8 @@ export default { items: [ { description: 'one' }, { description: 'two' }, - { description: 'three' }, - ], + { description: 'three' } + ] }, html: ` @@ -45,5 +45,5 @@ export default {

four

five

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-deep/_config.js b/test/runtime/samples/binding-input-text-deep/_config.js index e6113510a7..35443e9073 100644 --- a/test/runtime/samples/binding-input-text-deep/_config.js +++ b/test/runtime/samples/binding-input-text-deep/_config.js @@ -1,8 +1,8 @@ export default { props: { user: { - name: 'alice', - }, + name: 'alice' + } }, html: ` @@ -39,5 +39,5 @@ export default {

hello carol

`); - }, + } }; diff --git a/test/runtime/samples/binding-input-text-undefined/_config.js b/test/runtime/samples/binding-input-text-undefined/_config.js index 009e1b37ba..fa59b1f796 100644 --- a/test/runtime/samples/binding-input-text-undefined/_config.js +++ b/test/runtime/samples/binding-input-text-undefined/_config.js @@ -26,5 +26,5 @@ export default { component.x = undefined; assert.equal(input.value, ''); - }, + } }; diff --git a/test/runtime/samples/binding-input-text/_config.js b/test/runtime/samples/binding-input-text/_config.js index e7162b6153..52d8e44902 100644 --- a/test/runtime/samples/binding-input-text/_config.js +++ b/test/runtime/samples/binding-input-text/_config.js @@ -1,6 +1,6 @@ export default { props: { - name: 'world', + name: 'world' }, html: ` @@ -33,5 +33,5 @@ export default {

hello goodbye

`); - }, + } }; diff --git a/test/runtime/samples/binding-select-initial-value/_config.js b/test/runtime/samples/binding-select-initial-value/_config.js index d98e5d2e1c..d34a987fa5 100644 --- a/test/runtime/samples/binding-select-initial-value/_config.js +++ b/test/runtime/samples/binding-select-initial-value/_config.js @@ -24,7 +24,7 @@ export default { `, props: { - selected: 'b', + selected: 'b' }, test({ assert, component, target }) { @@ -33,5 +33,5 @@ export default { assert.equal(select.value, 'b'); assert.ok(options[1].selected); - }, + } }; diff --git a/test/runtime/samples/binding-select-late-2/_config.js b/test/runtime/samples/binding-select-late-2/_config.js new file mode 100644 index 0000000000..42c45d1366 --- /dev/null +++ b/test/runtime/samples/binding-select-late-2/_config.js @@ -0,0 +1,34 @@ +export default { + props: { + items: [], + selected: 'two' + }, + + html: ` + +

selected: two

+ `, + + ssrHtml: ` + +

selected: two

+ `, + + test({ assert, component, target }) { + component.items = [ 'one', 'two', 'three' ]; + + const options = target.querySelectorAll('option'); + assert.ok(!options[0].selected); + assert.ok(options[1].selected); + assert.ok(!options[2].selected); + + assert.htmlEqual(target.innerHTML, ` + +

selected: two

+ `); + } +}; diff --git a/test/runtime/samples/binding-select-late-2/main.svelte b/test/runtime/samples/binding-select-late-2/main.svelte new file mode 100644 index 0000000000..52cc14528a --- /dev/null +++ b/test/runtime/samples/binding-select-late-2/main.svelte @@ -0,0 +1,12 @@ + + + + +

selected: {selected || 'nothing'}

\ No newline at end of file diff --git a/test/runtime/samples/binding-select-late-3/_config.js b/test/runtime/samples/binding-select-late-3/_config.js new file mode 100644 index 0000000000..42c45d1366 --- /dev/null +++ b/test/runtime/samples/binding-select-late-3/_config.js @@ -0,0 +1,34 @@ +export default { + props: { + items: [], + selected: 'two' + }, + + html: ` + +

selected: two

+ `, + + ssrHtml: ` + +

selected: two

+ `, + + test({ assert, component, target }) { + component.items = [ 'one', 'two', 'three' ]; + + const options = target.querySelectorAll('option'); + assert.ok(!options[0].selected); + assert.ok(options[1].selected); + assert.ok(!options[2].selected); + + assert.htmlEqual(target.innerHTML, ` + +

selected: two

+ `); + } +}; diff --git a/test/runtime/samples/binding-select-late-3/main.svelte b/test/runtime/samples/binding-select-late-3/main.svelte new file mode 100644 index 0000000000..ec9ac8d345 --- /dev/null +++ b/test/runtime/samples/binding-select-late-3/main.svelte @@ -0,0 +1,12 @@ + + + + +

selected: {selected || 'nothing'}

\ No newline at end of file diff --git a/test/runtime/samples/binding-select-optgroup/_config.js b/test/runtime/samples/binding-select-optgroup/_config.js index e8a1d40797..03ad3e3280 100644 --- a/test/runtime/samples/binding-select-optgroup/_config.js +++ b/test/runtime/samples/binding-select-optgroup/_config.js @@ -45,5 +45,5 @@ export default { `); - }, + } }; diff --git a/test/runtime/samples/binding-select/_config.js b/test/runtime/samples/binding-select/_config.js index a5995061a0..310315176b 100644 --- a/test/runtime/samples/binding-select/_config.js +++ b/test/runtime/samples/binding-select/_config.js @@ -24,7 +24,7 @@ export default { `, props: { - selected: 'one', + selected: 'one' }, async test({ assert, component, target, window }) { @@ -53,5 +53,5 @@ export default { `); component.selected = 'three'; - }, + } }; diff --git a/test/runtime/samples/binding-store-deep/_config.js b/test/runtime/samples/binding-store-deep/_config.js index 8bdd41818b..c0f4f63578 100644 --- a/test/runtime/samples/binding-store-deep/_config.js +++ b/test/runtime/samples/binding-store-deep/_config.js @@ -37,5 +37,5 @@ export default { assert.deepEqual(names, ['world', 'everybody', 'goodbye']); unsubscribe(); - }, + } }; diff --git a/test/runtime/samples/binding-store/_config.js b/test/runtime/samples/binding-store/_config.js index eb22d3e96c..6e7a70878a 100644 --- a/test/runtime/samples/binding-store/_config.js +++ b/test/runtime/samples/binding-store/_config.js @@ -37,5 +37,5 @@ export default { assert.deepEqual(names, ['world', 'everybody', 'goodbye']); unsubscribe(); - }, + } }; diff --git a/test/runtime/samples/binding-textarea/_config.js b/test/runtime/samples/binding-textarea/_config.js index ac092096e6..70646e5e4b 100644 --- a/test/runtime/samples/binding-textarea/_config.js +++ b/test/runtime/samples/binding-textarea/_config.js @@ -1,6 +1,6 @@ export default { props: { - value: 'some text', + value: 'some text' }, html: ` @@ -33,5 +33,5 @@ export default {

goodbye

`); - }, + } }; diff --git a/test/runtime/samples/binding-this-each-block-property-2/_config.js b/test/runtime/samples/binding-this-each-block-property-2/_config.js new file mode 100644 index 0000000000..5c288cd6d1 --- /dev/null +++ b/test/runtime/samples/binding-this-each-block-property-2/_config.js @@ -0,0 +1,53 @@ +let calls = []; +function callback(refs) { + calls.push(refs.map(({ ref }) => ({ ref }))); +} +export default { + html: ``, + props: { + callback + }, + after_test() { + calls = []; + }, + async test({ assert, component, target }) { + assert.equal(calls.length, 1); + assert.equal(calls[0].length, 0); + + await component.addItem(); + + let divs = target.querySelectorAll("div"); + + assert.equal(calls.length, 3); + assert.equal(calls[1].length, 1); + assert.equal(calls[1][0].ref, null); + assert.equal(calls[2].length, 1); + assert.equal(calls[2][0].ref, divs[0]); + + await component.addItem(); + + divs = target.querySelectorAll("div"); + + assert.equal(calls.length, 5); + assert.equal(calls[3].length, 2); + assert.equal(calls[3][0].ref, divs[0]); + assert.equal(calls[3][1].ref, null); + assert.equal(calls[4].length, 2); + assert.equal(calls[4][0].ref, divs[0]); + assert.equal(calls[4][1].ref, divs[1]); + + await component.addItem(); + + divs = target.querySelectorAll("div"); + + assert.equal(calls.length, 7); + assert.equal(calls[5].length, 3); + assert.equal(calls[5][0].ref, divs[0]); + assert.equal(calls[5][1].ref, divs[1]); + assert.equal(calls[5][2].ref, null); + assert.equal(calls[6].length, 3); + assert.equal(calls[6][0].ref, divs[0]); + assert.equal(calls[6][1].ref, divs[1]); + assert.equal(calls[6][2].ref, divs[2]); + } +}; diff --git a/test/runtime/samples/binding-this-each-block-property-2/main.svelte b/test/runtime/samples/binding-this-each-block-property-2/main.svelte new file mode 100644 index 0000000000..bc1efe725c --- /dev/null +++ b/test/runtime/samples/binding-this-each-block-property-2/main.svelte @@ -0,0 +1,17 @@ + + +{#each refs as xxx} +
+{/each} \ No newline at end of file diff --git a/test/runtime/samples/bitmask-overflow-2/_config.js b/test/runtime/samples/bitmask-overflow-2/_config.js index 0b63791292..7304f6fa68 100644 --- a/test/runtime/samples/bitmask-overflow-2/_config.js +++ b/test/runtime/samples/bitmask-overflow-2/_config.js @@ -1,3 +1,3 @@ export default { - error: `potato is not defined`, + error: `potato is not defined` }; \ No newline at end of file diff --git a/test/runtime/samples/bitmask-overflow-3/_config.js b/test/runtime/samples/bitmask-overflow-3/_config.js index aee7d3237e..a55a73af1d 100644 --- a/test/runtime/samples/bitmask-overflow-3/_config.js +++ b/test/runtime/samples/bitmask-overflow-3/_config.js @@ -1,3 +1,3 @@ export default { - error: `A is not defined`, + error: `A is not defined` }; \ No newline at end of file diff --git a/test/runtime/samples/bitmask-overflow-slot-2/_config.js b/test/runtime/samples/bitmask-overflow-slot-2/_config.js index b01bd81e00..08c0c2f902 100644 --- a/test/runtime/samples/bitmask-overflow-slot-2/_config.js +++ b/test/runtime/samples/bitmask-overflow-slot-2/_config.js @@ -90,7 +90,7 @@ export default { assert.deepEqual(component.reads, { _0: 2, - _1: 2, + _1: 2 }); } }; \ No newline at end of file diff --git a/test/runtime/samples/class-with-spread-and-bind/_config.js b/test/runtime/samples/class-with-spread-and-bind/_config.js index f3c54e8c52..cab46706ef 100644 --- a/test/runtime/samples/class-with-spread-and-bind/_config.js +++ b/test/runtime/samples/class-with-spread-and-bind/_config.js @@ -1,6 +1,6 @@ export default { props: { - primary: true, + primary: true }, html: `
`, @@ -14,5 +14,5 @@ export default {
` ); - }, + } }; diff --git a/test/runtime/samples/component-binding-deep/_config.js b/test/runtime/samples/component-binding-deep/_config.js index be5a2624ac..8a2f5a56cf 100644 --- a/test/runtime/samples/component-binding-deep/_config.js +++ b/test/runtime/samples/component-binding-deep/_config.js @@ -21,5 +21,5 @@ export default {

blah

`); - }, + } }; diff --git a/test/runtime/samples/component-binding-store/Input.svelte b/test/runtime/samples/component-binding-store/Input.svelte new file mode 100644 index 0000000000..792104bec8 --- /dev/null +++ b/test/runtime/samples/component-binding-store/Input.svelte @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/test/runtime/samples/component-binding-store/_config.js b/test/runtime/samples/component-binding-store/_config.js new file mode 100644 index 0000000000..8b8a7a170a --- /dev/null +++ b/test/runtime/samples/component-binding-store/_config.js @@ -0,0 +1,61 @@ +export default { + html: ` + + +
+ `, + + async test({ assert, component, target, window }) { + let count = 0; + component.callback = () => { + count++; + }; + + const [input1, input2] = target.querySelectorAll("input"); + + input1.value = "1"; + await input1.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` + + +
1
+ ` + ); + assert.equal(input1.value, "1"); + assert.equal(input2.value, "1"); + assert.equal(count, 1); + + input2.value = "123"; + await input2.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` + + +
123
+ ` + ); + assert.equal(input1.value, "123"); + assert.equal(input2.value, "123"); + assert.equal(count, 2); + + input1.value = "456"; + await input1.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` + + +
456
+ ` + ); + assert.equal(input1.value, "456"); + assert.equal(input2.value, "456"); + assert.equal(count, 3); + } +}; diff --git a/test/runtime/samples/component-binding-store/main.svelte b/test/runtime/samples/component-binding-store/main.svelte new file mode 100644 index 0000000000..dba08e5276 --- /dev/null +++ b/test/runtime/samples/component-binding-store/main.svelte @@ -0,0 +1,18 @@ + + + + + + +
{$value.value}
\ No newline at end of file diff --git a/test/runtime/samples/component-event-handler-contenteditable/_config.js b/test/runtime/samples/component-event-handler-contenteditable/_config.js new file mode 100644 index 0000000000..3a85734975 --- /dev/null +++ b/test/runtime/samples/component-event-handler-contenteditable/_config.js @@ -0,0 +1,15 @@ +export default { + html: ` +
+ `, + + async test({ assert, component, target, window }) { + const div = target.querySelector('div'); + const text = window.document.createTextNode('a'); + div.insertBefore(text, null); + const event = new window.InputEvent('input'); + await div.dispatchEvent(event); + + assert.equal(div.textContent, 'a'); + } +}; diff --git a/test/runtime/samples/component-event-handler-contenteditable/main.svelte b/test/runtime/samples/component-event-handler-contenteditable/main.svelte new file mode 100644 index 0000000000..1eb5911df8 --- /dev/null +++ b/test/runtime/samples/component-event-handler-contenteditable/main.svelte @@ -0,0 +1,6 @@ + + +
{text}
diff --git a/test/runtime/samples/component-event-not-stale/_config.js b/test/runtime/samples/component-event-not-stale/_config.js index 912ea1f7d0..7951afb9d5 100644 --- a/test/runtime/samples/component-event-not-stale/_config.js +++ b/test/runtime/samples/component-event-not-stale/_config.js @@ -1,6 +1,6 @@ export default { props: { - value: 1, + value: 1 }, test({ assert, component, target, window }) { @@ -26,5 +26,5 @@ export default { { value: 2 }, { value: 2 } ]); - }, + } }; diff --git a/test/runtime/samples/component-events-console/_config.js b/test/runtime/samples/component-events-console/_config.js index b800749785..39ccbd719f 100644 --- a/test/runtime/samples/component-events-console/_config.js +++ b/test/runtime/samples/component-events-console/_config.js @@ -21,5 +21,5 @@ export default { } console.log = log; - }, + } }; diff --git a/test/runtime/samples/component-namespace/Tooltip.svelte b/test/runtime/samples/component-namespace/Tooltip.svelte new file mode 100644 index 0000000000..9b44ef57a8 --- /dev/null +++ b/test/runtime/samples/component-namespace/Tooltip.svelte @@ -0,0 +1 @@ +

i am a widget

\ No newline at end of file diff --git a/test/runtime/samples/component-namespace/Widget.svelte b/test/runtime/samples/component-namespace/Widget.svelte new file mode 100644 index 0000000000..b6aa45c6a8 --- /dev/null +++ b/test/runtime/samples/component-namespace/Widget.svelte @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/test/runtime/samples/component-namespace/_config.js b/test/runtime/samples/component-namespace/_config.js new file mode 100644 index 0000000000..5b96ac8df0 --- /dev/null +++ b/test/runtime/samples/component-namespace/_config.js @@ -0,0 +1,3 @@ +export default { + html: '

i am a widget

' +}; diff --git a/test/runtime/samples/component-namespace/main.svelte b/test/runtime/samples/component-namespace/main.svelte new file mode 100644 index 0000000000..3f53b2b1c8 --- /dev/null +++ b/test/runtime/samples/component-namespace/main.svelte @@ -0,0 +1,8 @@ + + +{#each widgets as LazyWidget} + +{/each} \ No newline at end of file diff --git a/test/runtime/samples/component-shorthand-import/_config.js b/test/runtime/samples/component-shorthand-import/_config.js index ceb8e19f68..c955224600 100644 --- a/test/runtime/samples/component-shorthand-import/_config.js +++ b/test/runtime/samples/component-shorthand-import/_config.js @@ -1,3 +1,3 @@ export default { - html: `

This is the widget.

`, + html: `

This is the widget.

` }; diff --git a/test/runtime/samples/component-slot-fallback-3/_config.js b/test/runtime/samples/component-slot-fallback-3/_config.js index b5591fb5e0..25cc65eb2d 100644 --- a/test/runtime/samples/component-slot-fallback-3/_config.js +++ b/test/runtime/samples/component-slot-fallback-3/_config.js @@ -2,5 +2,5 @@ export default { html: `
Hello World
Hello
world
Bye
World
- `, + ` }; diff --git a/test/runtime/samples/component-slot-fallback-4/_config.js b/test/runtime/samples/component-slot-fallback-4/_config.js index b7c2b63ed6..4ebe353513 100644 --- a/test/runtime/samples/component-slot-fallback-4/_config.js +++ b/test/runtime/samples/component-slot-fallback-4/_config.js @@ -1,5 +1,5 @@ export default { html: ` foobar - `, + ` }; diff --git a/test/runtime/samples/component-slot-let-in-slot/_config.js b/test/runtime/samples/component-slot-let-in-slot/_config.js index a86d869581..eb16c27fda 100644 --- a/test/runtime/samples/component-slot-let-in-slot/_config.js +++ b/test/runtime/samples/component-slot-let-in-slot/_config.js @@ -1,6 +1,6 @@ export default { props: { - prop: 'a', + prop: 'a' }, html: 'a', diff --git a/test/runtime/samples/component-slot-nested-if/_config.js b/test/runtime/samples/component-slot-nested-if/_config.js index 89dfd006cc..45c570fc22 100644 --- a/test/runtime/samples/component-slot-nested-if/_config.js +++ b/test/runtime/samples/component-slot-nested-if/_config.js @@ -26,5 +26,5 @@ export default { Display: abc ` ); - }, + } }; diff --git a/test/runtime/samples/deconflict-builtins-2/_config.js b/test/runtime/samples/deconflict-builtins-2/_config.js index 5870ff073b..1489f83dc4 100644 --- a/test/runtime/samples/deconflict-builtins-2/_config.js +++ b/test/runtime/samples/deconflict-builtins-2/_config.js @@ -1,4 +1,4 @@ export default { html: `hello world`, - preserveIdentifiers: true, + preserveIdentifiers: true }; \ No newline at end of file diff --git a/test/runtime/samples/dev-warning-missing-data-each/_config.js b/test/runtime/samples/dev-warning-missing-data-each/_config.js index 92cda48fce..7d7794eff4 100644 --- a/test/runtime/samples/dev-warning-missing-data-each/_config.js +++ b/test/runtime/samples/dev-warning-missing-data-each/_config.js @@ -7,18 +7,18 @@ export default { letters: [ { id: 1, - char: 'a', + char: 'a' }, { id: 2, - char: 'b', + char: 'b' }, { id: 3, - char: 'c', - }, - ], + char: 'c' + } + ] }, - warnings: [], + warnings: [] }; diff --git a/test/runtime/samples/document-event/_config.js b/test/runtime/samples/document-event/_config.js index f5e4b46f4f..d9a8866275 100644 --- a/test/runtime/samples/document-event/_config.js +++ b/test/runtime/samples/document-event/_config.js @@ -9,5 +9,5 @@ export default { const event2 = new window.Event('mouseleave'); window.document.body.dispatchEvent(event2); assert.deepEqual(component.events, ['enter', 'leave']); - }, + } }; diff --git a/test/runtime/samples/each-block-array-literal/_config.js b/test/runtime/samples/each-block-array-literal/_config.js index 288d1cd09f..164e4730bc 100644 --- a/test/runtime/samples/each-block-array-literal/_config.js +++ b/test/runtime/samples/each-block-array-literal/_config.js @@ -15,5 +15,5 @@ export default { button.dispatchEvent(event); assert.equal(component.clicked, 'racoon'); - }, + } }; diff --git a/test/runtime/samples/each-block-destructured-array-sparse/_config.js b/test/runtime/samples/each-block-destructured-array-sparse/_config.js index 9805276600..331c3aec1b 100644 --- a/test/runtime/samples/each-block-destructured-array-sparse/_config.js +++ b/test/runtime/samples/each-block-destructured-array-sparse/_config.js @@ -16,5 +16,5 @@ export default { assert.htmlEqual( target.innerHTML, `

bar

`); - }, + } }; diff --git a/test/runtime/samples/each-block-destructured-array/_config.js b/test/runtime/samples/each-block-destructured-array/_config.js index 432d8a3a78..e2924c8656 100644 --- a/test/runtime/samples/each-block-destructured-array/_config.js +++ b/test/runtime/samples/each-block-destructured-array/_config.js @@ -16,5 +16,5 @@ export default { assert.htmlEqual( target.innerHTML, `

foo: bar

`); - }, + } }; diff --git a/test/runtime/samples/each-block-destructured-default/_config.js b/test/runtime/samples/each-block-destructured-default/_config.js index 133fd68532..0e99fd589f 100644 --- a/test/runtime/samples/each-block-destructured-default/_config.js +++ b/test/runtime/samples/each-block-destructured-default/_config.js @@ -18,5 +18,5 @@ export default { assert.htmlEqual(target.innerHTML, `

cow - ‎B. taurus - 50kg

`); - }, + } }; diff --git a/test/runtime/samples/each-block-destructured-object-binding/_config.js b/test/runtime/samples/each-block-destructured-object-binding/_config.js index 8b59a97034..2ab3e24397 100644 --- a/test/runtime/samples/each-block-destructured-object-binding/_config.js +++ b/test/runtime/samples/each-block-destructured-object-binding/_config.js @@ -1,6 +1,6 @@ export default { props: { - people: [{ name: { first: 'Doctor', last: 'Who' } }], + people: [{ name: { first: 'Doctor', last: 'Who' } }] }, html: ` @@ -41,5 +41,5 @@ export default {

Frank Oz

`); - }, + } }; diff --git a/test/runtime/samples/each-block-destructured-object-rest/_config.js b/test/runtime/samples/each-block-destructured-object-rest/_config.js index 561d4e8442..be5d38b555 100644 --- a/test/runtime/samples/each-block-destructured-object-rest/_config.js +++ b/test/runtime/samples/each-block-destructured-object-rest/_config.js @@ -16,5 +16,5 @@ export default { assert.htmlEqual(target.innerHTML, `

cow

`); - }, + } }; diff --git a/test/runtime/samples/each-block-destructured-object/_config.js b/test/runtime/samples/each-block-destructured-object/_config.js index dc3943fffe..feec72f402 100644 --- a/test/runtime/samples/each-block-destructured-object/_config.js +++ b/test/runtime/samples/each-block-destructured-object/_config.js @@ -16,5 +16,5 @@ export default { assert.htmlEqual( target.innerHTML, `

cow: hooves

`); - }, + } }; diff --git a/test/runtime/samples/each-block-else-mount-or-intro/_config.js b/test/runtime/samples/each-block-else-mount-or-intro/_config.js index 8460a4b5e0..acf2bafd5f 100644 --- a/test/runtime/samples/each-block-else-mount-or-intro/_config.js +++ b/test/runtime/samples/each-block-else-mount-or-intro/_config.js @@ -1,4 +1,4 @@ export default { props: { items: [] }, - html: `No items.`, + html: `No items.` }; diff --git a/test/runtime/samples/each-block-in-if-block/_config.js b/test/runtime/samples/each-block-in-if-block/_config.js index eda3ca14a9..082b9b3033 100644 --- a/test/runtime/samples/each-block-in-if-block/_config.js +++ b/test/runtime/samples/each-block-in-if-block/_config.js @@ -1,7 +1,7 @@ export default { props: { dummy: false, - fruits: ['Apple', 'Banana', 'Tomato'], + fruits: ['Apple', 'Banana', 'Tomato'] }, html: '
Apple
Banana
Tomato
', diff --git a/test/runtime/samples/each-block-keyed-component-action/Component.svelte b/test/runtime/samples/each-block-keyed-component-action/Component.svelte new file mode 100644 index 0000000000..18a6c7452a --- /dev/null +++ b/test/runtime/samples/each-block-keyed-component-action/Component.svelte @@ -0,0 +1,5 @@ + + +
diff --git a/test/runtime/samples/each-block-keyed-component-action/_config.js b/test/runtime/samples/each-block-keyed-component-action/_config.js new file mode 100644 index 0000000000..66c609be01 --- /dev/null +++ b/test/runtime/samples/each-block-keyed-component-action/_config.js @@ -0,0 +1,21 @@ +export default { + test({ assert, component, raf }) { + assert.equal(component.count, 0); + + component.arr = ["2"]; + + assert.equal(component.count, 1); + + component.arr = ["1", "2"]; + + assert.equal(component.count, 2); + + component.arr = ["2", "1"]; + + assert.equal(component.count, 2); + + component.arr = []; + + assert.equal(component.count, 0); + } +}; diff --git a/test/runtime/samples/each-block-keyed-component-action/main.svelte b/test/runtime/samples/each-block-keyed-component-action/main.svelte new file mode 100644 index 0000000000..bfacdf402a --- /dev/null +++ b/test/runtime/samples/each-block-keyed-component-action/main.svelte @@ -0,0 +1,17 @@ + + +{#each arr as item (item)} + +{/each} diff --git a/test/runtime/samples/each-block-keyed-empty/_config.js b/test/runtime/samples/each-block-keyed-empty/_config.js index cf8f4d3219..2c9055ce44 100644 --- a/test/runtime/samples/each-block-keyed-empty/_config.js +++ b/test/runtime/samples/each-block-keyed-empty/_config.js @@ -1,6 +1,6 @@ export default { props: { - x: [{ z: 1 }, { z: 2 }], + x: [{ z: 1 }, { z: 2 }] }, html: `` diff --git a/test/runtime/samples/each-block-keyed-non-prop/_config.js b/test/runtime/samples/each-block-keyed-non-prop/_config.js index 90e9a7f9c8..2cccbedef0 100644 --- a/test/runtime/samples/each-block-keyed-non-prop/_config.js +++ b/test/runtime/samples/each-block-keyed-non-prop/_config.js @@ -25,5 +25,5 @@ export default { assert.equal(p1, p4, 'first

element should be retained'); assert.equal(p3, p5, 'last

element should be retained'); - }, + } }; diff --git a/test/runtime/samples/each-block-keyed-random-permute/_config.js b/test/runtime/samples/each-block-keyed-random-permute/_config.js index 80bf2d9115..4e6830a616 100644 --- a/test/runtime/samples/each-block-keyed-random-permute/_config.js +++ b/test/runtime/samples/each-block-keyed-random-permute/_config.js @@ -19,7 +19,7 @@ function permute() { export default { props: { - values: toObjects('abc'), + values: toObjects('abc') }, html: `(a)(b)(c)`, diff --git a/test/runtime/samples/each-block-keyed-shift/_config.js b/test/runtime/samples/each-block-keyed-shift/_config.js index 44ca8447f0..4e7809445c 100644 --- a/test/runtime/samples/each-block-keyed-shift/_config.js +++ b/test/runtime/samples/each-block-keyed-shift/_config.js @@ -1,6 +1,6 @@ export default { props: { - titles: [{ name: 'a', }, { name: 'b' }, { name: 'c' }] + titles: [{ name: 'a' }, { name: 'b' }, { name: 'c' }] }, html: ` diff --git a/test/runtime/samples/each-block-keyed-siblings/_config.js b/test/runtime/samples/each-block-keyed-siblings/_config.js index d87f8943da..a52b6c404d 100644 --- a/test/runtime/samples/each-block-keyed-siblings/_config.js +++ b/test/runtime/samples/each-block-keyed-siblings/_config.js @@ -1,7 +1,7 @@ export default { props: { ones: [{ text: '1' }], - twos: [{ text: '2' }], + twos: [{ text: '2' }] }, html: ` @@ -16,5 +16,5 @@ export default {

11
2
`); - }, + } }; diff --git a/test/runtime/samples/each-block-keyed-static/_config.js b/test/runtime/samples/each-block-keyed-static/_config.js index 629ea47ebb..57800c454f 100644 --- a/test/runtime/samples/each-block-keyed-static/_config.js +++ b/test/runtime/samples/each-block-keyed-static/_config.js @@ -1,6 +1,6 @@ export default { props: { - x: [{ z: 1 }, { z: 2 }], + x: [{ z: 1 }, { z: 2 }] }, html: ` diff --git a/test/runtime/samples/each-block-scope-shadow-bind-2/_config.js b/test/runtime/samples/each-block-scope-shadow-bind-2/_config.js new file mode 100644 index 0000000000..384c2dd2b4 --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind-2/_config.js @@ -0,0 +1,23 @@ +export default { + html: ` + Hello + + `, + ssrHtml: ` + Hello + + `, + async test({ assert, target, window }) { + const input = target.querySelector("input"); + input.value = "abcd"; + await input.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` + abcd + + ` + ); + } +}; diff --git a/test/runtime/samples/each-block-scope-shadow-bind-2/main.svelte b/test/runtime/samples/each-block-scope-shadow-bind-2/main.svelte new file mode 100644 index 0000000000..f5bff01e6c --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind-2/main.svelte @@ -0,0 +1,10 @@ + + +{#each a as { a }} + {a} + +{/each} \ No newline at end of file diff --git a/test/runtime/samples/each-block-scope-shadow-bind-3/_config.js b/test/runtime/samples/each-block-scope-shadow-bind-3/_config.js new file mode 100644 index 0000000000..92230a735c --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind-3/_config.js @@ -0,0 +1,105 @@ +export default { + html: ` +
+ Hello World + + +
+
+ Sapper App + + +
+ `, + + ssrHtml: ` +
+ Hello World + + +
+
+ Sapper App + + +
+ `, + async test({ assert, target, window }) { + const [input1, input2, input3, input4] = target.querySelectorAll("input"); + input1.value = "Awesome"; + await input1.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ Awesome World + + +
+
+ Sapper App + + +
+ ` + ); + + input2.value = "Svelte"; + await input2.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ Awesome Svelte + + +
+
+ Sapper App + + +
+ ` + ); + + input3.value = "Foo"; + await input3.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ Awesome Svelte + + +
+
+ Foo App + + +
+ ` + ); + + input4.value = "Bar"; + await input4.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ Awesome Svelte + + +
+
+ Foo Bar + + +
+ ` + ); + } +}; diff --git a/test/runtime/samples/each-block-scope-shadow-bind-3/main.svelte b/test/runtime/samples/each-block-scope-shadow-bind-3/main.svelte new file mode 100644 index 0000000000..2e8fe5e591 --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind-3/main.svelte @@ -0,0 +1,14 @@ + + +{#each a as a} +
+ {a[0]} {a[1]} + + +
+{/each} \ No newline at end of file diff --git a/test/runtime/samples/each-block-scope-shadow-bind-4/_config.js b/test/runtime/samples/each-block-scope-shadow-bind-4/_config.js new file mode 100644 index 0000000000..418fcbea4a --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind-4/_config.js @@ -0,0 +1,64 @@ +export default { + html: ` +
+ b: Hello + +
+ + `, + ssrHtml: ` +
+ b: Hello + +
+ + `, + async test({ assert, target, window }) { + const input = target.querySelector("input"); + const button = target.querySelector("button"); + + input.value = "Awesome"; + await input.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ b: Awesome + +
+ + ` + ); + + + await button.dispatchEvent(new window.MouseEvent("click")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ c: World + +
+ + ` + ); + + assert.equal(input.value, 'World'); + + input.value = "Svelte"; + await input.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` +
+ c: Svelte + +
+ + ` + ); + } +}; diff --git a/test/runtime/samples/each-block-scope-shadow-bind-4/main.svelte b/test/runtime/samples/each-block-scope-shadow-bind-4/main.svelte new file mode 100644 index 0000000000..bc4f172dd0 --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind-4/main.svelte @@ -0,0 +1,14 @@ + + +{#each a as { a, key }} +
+ {key}: {a[key]} + +
+{/each} + + \ No newline at end of file diff --git a/test/runtime/samples/each-block-scope-shadow-bind/_config.js b/test/runtime/samples/each-block-scope-shadow-bind/_config.js new file mode 100644 index 0000000000..384c2dd2b4 --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind/_config.js @@ -0,0 +1,23 @@ +export default { + html: ` + Hello + + `, + ssrHtml: ` + Hello + + `, + async test({ assert, target, window }) { + const input = target.querySelector("input"); + input.value = "abcd"; + await input.dispatchEvent(new window.Event("input")); + + assert.htmlEqual( + target.innerHTML, + ` + abcd + + ` + ); + } +}; diff --git a/test/runtime/samples/each-block-scope-shadow-bind/main.svelte b/test/runtime/samples/each-block-scope-shadow-bind/main.svelte new file mode 100644 index 0000000000..f3471e179f --- /dev/null +++ b/test/runtime/samples/each-block-scope-shadow-bind/main.svelte @@ -0,0 +1,10 @@ + + +{#each a as a} + {a} + +{/each} \ No newline at end of file diff --git a/test/runtime/samples/each-block-scope-shadow-self/_config.js b/test/runtime/samples/each-block-scope-shadow-self/_config.js index 1669dc5b6e..867aadfab9 100644 --- a/test/runtime/samples/each-block-scope-shadow-self/_config.js +++ b/test/runtime/samples/each-block-scope-shadow-self/_config.js @@ -9,5 +9,5 @@ export default { assert.equal(target.querySelectorAll('input').length, 3); assert.deepEqual(component.data, { a: 'svelte', b: 'B', c: 'C' }); assert.deepEqual(component.x, ['a', 'b', 'c']); - }, + } }; diff --git a/test/runtime/samples/each-blocks-assignment-2/_config.js b/test/runtime/samples/each-blocks-assignment-2/_config.js new file mode 100644 index 0000000000..0831617261 --- /dev/null +++ b/test/runtime/samples/each-blocks-assignment-2/_config.js @@ -0,0 +1,20 @@ +export default { + html: ` + foo + + `, + async test({ assert, component, target, window }) { + const button = target.querySelector("button"); + + const clickEvent = new window.MouseEvent("click"); + await button.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + bar + + ` + ); + } +}; diff --git a/test/runtime/samples/each-blocks-assignment-2/main.svelte b/test/runtime/samples/each-blocks-assignment-2/main.svelte new file mode 100644 index 0000000000..5ef3ae83ac --- /dev/null +++ b/test/runtime/samples/each-blocks-assignment-2/main.svelte @@ -0,0 +1,12 @@ + + +{#each arr as o} + {o.prop} + +{/each} \ No newline at end of file diff --git a/test/runtime/samples/each-blocks-assignment/_config.js b/test/runtime/samples/each-blocks-assignment/_config.js new file mode 100644 index 0000000000..2c95d486d6 --- /dev/null +++ b/test/runtime/samples/each-blocks-assignment/_config.js @@ -0,0 +1,97 @@ +export default { + html: ` + + 1 + + 2 + + 3 + + `, + async test({ assert, component, target, window }) { + let [incrementBtn, ...buttons] = target.querySelectorAll("button"); + + const clickEvent = new window.MouseEvent("click"); + await buttons[0].dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + + 2 + + 2 + + 3 + + ` + ); + + await buttons[0].dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + + 4 + + 2 + + 3 + + ` + ); + + await buttons[2].dispatchEvent(clickEvent); + await buttons[2].dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + + 4 + + 2 + + 12 + + ` + ); + + await incrementBtn.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + + 4 + + 2 + + 12 + + 4 + + ` + ); + + [incrementBtn, ...buttons] = target.querySelectorAll("button"); + + await buttons[3].dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + + 4 + + 2 + + 12 + + 8 + + ` + ); + } +}; diff --git a/test/runtime/samples/each-blocks-assignment/main.svelte b/test/runtime/samples/each-blocks-assignment/main.svelte new file mode 100644 index 0000000000..f74bffbe04 --- /dev/null +++ b/test/runtime/samples/each-blocks-assignment/main.svelte @@ -0,0 +1,13 @@ + + + +{#each arr as o} + {o} + +{/each} \ No newline at end of file diff --git a/test/runtime/samples/empty-dom/_config.js b/test/runtime/samples/empty-dom/_config.js index e3e3d0ecd5..7da2831db4 100644 --- a/test/runtime/samples/empty-dom/_config.js +++ b/test/runtime/samples/empty-dom/_config.js @@ -1,3 +1,3 @@ export default { - html: '', + html: '' }; \ No newline at end of file diff --git a/test/runtime/samples/empty-style-block/_config.js b/test/runtime/samples/empty-style-block/_config.js index 0375bad029..22dc25b41e 100644 --- a/test/runtime/samples/empty-style-block/_config.js +++ b/test/runtime/samples/empty-style-block/_config.js @@ -1,3 +1,3 @@ export default { - html: '', + html: '' }; diff --git a/test/runtime/samples/escape-template-literals/_config.js b/test/runtime/samples/escape-template-literals/_config.js index 1419d65679..9e50f94764 100644 --- a/test/runtime/samples/escape-template-literals/_config.js +++ b/test/runtime/samples/escape-template-literals/_config.js @@ -1,3 +1,3 @@ export default { - html: '`${foo}\\n`\n
foo
\n
`${foo}\\n`
', + html: '`${foo}\\n`\n
foo
\n
`${foo}\\n`
' }; diff --git a/test/runtime/samples/event-handler-async/_config.js b/test/runtime/samples/event-handler-async/_config.js index fab4d998b6..b483d039ed 100644 --- a/test/runtime/samples/event-handler-async/_config.js +++ b/test/runtime/samples/event-handler-async/_config.js @@ -1,5 +1,5 @@ export default { html: ` - `, + ` }; diff --git a/test/runtime/samples/event-handler-dynamic-2/_config.js b/test/runtime/samples/event-handler-dynamic-2/_config.js index c996d8f2aa..5fded47855 100644 --- a/test/runtime/samples/event-handler-dynamic-2/_config.js +++ b/test/runtime/samples/event-handler-dynamic-2/_config.js @@ -29,5 +29,5 @@ export default { await handler_b.dispatchEvent(event); assert.equal(p.innerHTML, '2'); - }, + } }; diff --git a/test/runtime/samples/event-handler-dynamic-bound-var/_config.js b/test/runtime/samples/event-handler-dynamic-bound-var/_config.js index c832127c09..c490db000a 100644 --- a/test/runtime/samples/event-handler-dynamic-bound-var/_config.js +++ b/test/runtime/samples/event-handler-dynamic-bound-var/_config.js @@ -16,5 +16,5 @@ export default { Bye World ` ); - }, + } }; diff --git a/test/runtime/samples/event-handler-dynamic-expression/_config.js b/test/runtime/samples/event-handler-dynamic-expression/_config.js index c4d259a542..b202196ebf 100644 --- a/test/runtime/samples/event-handler-dynamic-expression/_config.js +++ b/test/runtime/samples/event-handler-dynamic-expression/_config.js @@ -16,5 +16,5 @@ export default { await button.dispatchEvent(event); assert.htmlEqual(target.innerHTML, ``); - }, + } }; diff --git a/test/runtime/samples/event-handler-dynamic-hash/_config.js b/test/runtime/samples/event-handler-dynamic-hash/_config.js index e60e561524..dcfebb7008 100644 --- a/test/runtime/samples/event-handler-dynamic-hash/_config.js +++ b/test/runtime/samples/event-handler-dynamic-hash/_config.js @@ -52,5 +52,5 @@ export default {

2

`); - }, + } }; diff --git a/test/runtime/samples/event-handler-dynamic-invalid/_config.js b/test/runtime/samples/event-handler-dynamic-invalid/_config.js index ba1777f945..ad9d8c8680 100644 --- a/test/runtime/samples/event-handler-dynamic-invalid/_config.js +++ b/test/runtime/samples/event-handler-dynamic-invalid/_config.js @@ -24,5 +24,5 @@ export default { await buttonInvalid.dispatchEvent(event); assert.equal(err, "", err); - }, + } }; diff --git a/test/runtime/samples/event-handler-dynamic-modifier-self/_config.js b/test/runtime/samples/event-handler-dynamic-modifier-self/_config.js index 6d7d29e482..6bd96ba8aa 100644 --- a/test/runtime/samples/event-handler-dynamic-modifier-self/_config.js +++ b/test/runtime/samples/event-handler-dynamic-modifier-self/_config.js @@ -12,5 +12,5 @@ export default { await button.dispatchEvent(event); assert.ok(!component.inner_clicked); - }, + } }; diff --git a/test/runtime/samples/event-handler-dynamic/_config.js b/test/runtime/samples/event-handler-dynamic/_config.js index e60e561524..dcfebb7008 100644 --- a/test/runtime/samples/event-handler-dynamic/_config.js +++ b/test/runtime/samples/event-handler-dynamic/_config.js @@ -52,5 +52,5 @@ export default {

2

`); - }, + } }; diff --git a/test/runtime/samples/event-handler-each-this/_config.js b/test/runtime/samples/event-handler-each-this/_config.js index 3ab2d5acdc..7f6528977c 100644 --- a/test/runtime/samples/event-handler-each-this/_config.js +++ b/test/runtime/samples/event-handler-each-this/_config.js @@ -1,6 +1,6 @@ export default { props: { - items: ['foo', 'bar', 'baz'], + items: ['foo', 'bar', 'baz'] }, html: ` diff --git a/test/runtime/samples/event-handler-modifier-self/_config.js b/test/runtime/samples/event-handler-modifier-self/_config.js index 6d7d29e482..6bd96ba8aa 100644 --- a/test/runtime/samples/event-handler-modifier-self/_config.js +++ b/test/runtime/samples/event-handler-modifier-self/_config.js @@ -12,5 +12,5 @@ export default { await button.dispatchEvent(event); assert.ok(!component.inner_clicked); - }, + } }; diff --git a/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js b/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js index d5f3def7f1..34cee8157c 100644 --- a/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js +++ b/test/runtime/samples/globals-not-overwritten-by-bindings/_config.js @@ -37,17 +37,17 @@ export default { todos: { first: { description: 'Buy some milk', - done: true, + done: true }, second: { description: 'Do the laundry', - done: true, + done: true }, third: { description: "Find life's true purpose", - done: false, - }, - }, + done: false + } + } }, async test({ assert, component, target, window }) { @@ -74,5 +74,5 @@ export default {
`); - }, + } }; diff --git a/test/runtime/samples/globals-shadowed-by-each-binding/_config.js b/test/runtime/samples/globals-shadowed-by-each-binding/_config.js index f69e5e8b0e..50feb09bb6 100644 --- a/test/runtime/samples/globals-shadowed-by-each-binding/_config.js +++ b/test/runtime/samples/globals-shadowed-by-each-binding/_config.js @@ -1,3 +1,3 @@ export default { - html: '

Alert1

Alert2

', + html: '

Alert1

Alert2

' }; diff --git a/test/runtime/samples/if-block-component-store-function-conditionals/_config.js b/test/runtime/samples/if-block-component-store-function-conditionals/_config.js index db171f2fd1..609765d225 100644 --- a/test/runtime/samples/if-block-component-store-function-conditionals/_config.js +++ b/test/runtime/samples/if-block-component-store-function-conditionals/_config.js @@ -1,3 +1,3 @@ export default { - html: '

OK

', + html: '

OK

' }; diff --git a/test/runtime/samples/if-block-component-without-outro/_config.js b/test/runtime/samples/if-block-component-without-outro/_config.js index 8106081c7c..fbcc328fa3 100644 --- a/test/runtime/samples/if-block-component-without-outro/_config.js +++ b/test/runtime/samples/if-block-component-without-outro/_config.js @@ -1,6 +1,6 @@ export default { props: { - foo: true, + foo: true }, html: '
A wild component appears
', @@ -8,5 +8,5 @@ export default { test({ assert, component, target }) { component.foo = false; assert.htmlEqual(target.innerHTML, ''); - }, + } }; diff --git a/test/runtime/samples/if-block-else-in-each/_config.js b/test/runtime/samples/if-block-else-in-each/_config.js index 44268f32b9..e75dcb15ee 100644 --- a/test/runtime/samples/if-block-else-in-each/_config.js +++ b/test/runtime/samples/if-block-else-in-each/_config.js @@ -1,9 +1,9 @@ export default { props: { - array: [true, false], + array: [true, false] }, html: `
foo
bar
- `, + ` }; diff --git a/test/runtime/samples/if-block-else-partial-outro/_config.js b/test/runtime/samples/if-block-else-partial-outro/_config.js index a358680edf..ae58d25c23 100644 --- a/test/runtime/samples/if-block-else-partial-outro/_config.js +++ b/test/runtime/samples/if-block-else-partial-outro/_config.js @@ -1,7 +1,7 @@ export default { props: { x: 1, - y: false, + y: false }, html: ` @@ -13,5 +13,5 @@ export default { assert.htmlEqual(target.innerHTML, ` 2 `); - }, + } }; diff --git a/test/runtime/samples/if-block-no-outro-else-with-outro/_config.js b/test/runtime/samples/if-block-no-outro-else-with-outro/_config.js index b2e71ea01f..da80f5be12 100644 --- a/test/runtime/samples/if-block-no-outro-else-with-outro/_config.js +++ b/test/runtime/samples/if-block-no-outro-else-with-outro/_config.js @@ -18,5 +18,5 @@ export default {

y

`); - }, + } }; diff --git a/test/runtime/samples/if-block-outro-unique-select-block-type/_config.js b/test/runtime/samples/if-block-outro-unique-select-block-type/_config.js index b94da1a576..15213e19b3 100644 --- a/test/runtime/samples/if-block-outro-unique-select-block-type/_config.js +++ b/test/runtime/samples/if-block-outro-unique-select-block-type/_config.js @@ -2,5 +2,5 @@ export default { html: `
- `, + ` }; diff --git a/test/runtime/samples/initial-state-assign/_config.js b/test/runtime/samples/initial-state-assign/_config.js index b4067fef80..95a1a5e068 100644 --- a/test/runtime/samples/initial-state-assign/_config.js +++ b/test/runtime/samples/initial-state-assign/_config.js @@ -3,5 +3,5 @@ export default { html: ` "foo" "bar" - `, + ` }; diff --git a/test/runtime/samples/innerhtml-with-comments/_config.js b/test/runtime/samples/innerhtml-with-comments/_config.js new file mode 100644 index 0000000000..95d4a6fa96 --- /dev/null +++ b/test/runtime/samples/innerhtml-with-comments/_config.js @@ -0,0 +1,8 @@ +export default { + html: ` + + Style: + Bootstrap. + + ` +}; \ No newline at end of file diff --git a/test/runtime/samples/innerhtml-with-comments/main.svelte b/test/runtime/samples/innerhtml-with-comments/main.svelte new file mode 100644 index 0000000000..e00f755072 --- /dev/null +++ b/test/runtime/samples/innerhtml-with-comments/main.svelte @@ -0,0 +1,5 @@ + + Style: + + Bootstrap. + \ No newline at end of file diff --git a/test/runtime/samples/lifecycle-render-order-for-children/_config.js b/test/runtime/samples/lifecycle-render-order-for-children/_config.js index 033b593aea..d182d5a97e 100644 --- a/test/runtime/samples/lifecycle-render-order-for-children/_config.js +++ b/test/runtime/samples/lifecycle-render-order-for-children/_config.js @@ -21,7 +21,7 @@ export default { '3: onMount', '3: afterUpdate', '0: onMount', - '0: afterUpdate', + '0: afterUpdate' ]); } else { assert.deepEqual(order, [ @@ -40,10 +40,10 @@ export default { '3: onMount', '3: afterUpdate', '0: onMount', - '0: afterUpdate', + '0: afterUpdate' ]); } order.length = 0; - }, + } }; diff --git a/test/runtime/samples/loop-protect-generator-opt-out/_config.js b/test/runtime/samples/loop-protect-generator-opt-out/_config.js index 9b6a24b513..0fe83a36db 100644 --- a/test/runtime/samples/loop-protect-generator-opt-out/_config.js +++ b/test/runtime/samples/loop-protect-generator-opt-out/_config.js @@ -1,6 +1,6 @@ export default { compileOptions: { dev: true, - loopGuardTimeout: 1, - }, + loopGuardTimeout: 1 + } }; diff --git a/test/runtime/samples/loop-protect-inner-function/_config.js b/test/runtime/samples/loop-protect-inner-function/_config.js index 862d4f4c0f..1b553e2475 100644 --- a/test/runtime/samples/loop-protect-inner-function/_config.js +++ b/test/runtime/samples/loop-protect-inner-function/_config.js @@ -2,6 +2,6 @@ export default { html: '
', compileOptions: { dev: true, - loopGuardTimeout: 100, + loopGuardTimeout: 100 } }; diff --git a/test/runtime/samples/loop-protect/_config.js b/test/runtime/samples/loop-protect/_config.js index 75f75c003d..230bbeb53d 100644 --- a/test/runtime/samples/loop-protect/_config.js +++ b/test/runtime/samples/loop-protect/_config.js @@ -2,6 +2,6 @@ export default { error: 'Infinite loop detected', compileOptions: { dev: true, - loopGuardTimeout: 100, + loopGuardTimeout: 100 } }; diff --git a/test/runtime/samples/nested-transition-detach-each/_config.js b/test/runtime/samples/nested-transition-detach-each/_config.js index e17fe1bc4d..00c2d44048 100644 --- a/test/runtime/samples/nested-transition-detach-each/_config.js +++ b/test/runtime/samples/nested-transition-detach-each/_config.js @@ -35,5 +35,5 @@ export default { raf.tick(0); raf.tick(100); assert.htmlEqual(target.innerHTML, ``); - }, + } }; diff --git a/test/runtime/samples/nested-transition-detach-if-false/_config.js b/test/runtime/samples/nested-transition-detach-if-false/_config.js index d2ae78ffe3..1d42094192 100644 --- a/test/runtime/samples/nested-transition-detach-if-false/_config.js +++ b/test/runtime/samples/nested-transition-detach-if-false/_config.js @@ -20,5 +20,5 @@ export default { a `); - }, + } }; diff --git a/test/runtime/samples/nested-transition-if-block-not-remounted/_config.js b/test/runtime/samples/nested-transition-if-block-not-remounted/_config.js index 6696389e6e..30ff83b39f 100644 --- a/test/runtime/samples/nested-transition-if-block-not-remounted/_config.js +++ b/test/runtime/samples/nested-transition-if-block-not-remounted/_config.js @@ -20,5 +20,5 @@ export default { }; component.value = 'two'; - }, + } }; diff --git a/test/runtime/samples/noscript-removal/_config.js b/test/runtime/samples/noscript-removal/_config.js index 35bdcefd96..709792c14a 100644 --- a/test/runtime/samples/noscript-removal/_config.js +++ b/test/runtime/samples/noscript-removal/_config.js @@ -5,5 +5,5 @@ export default {
foo
foo
foo
-`, +` }; diff --git a/test/runtime/samples/paren-wrapped-expressions/_config.js b/test/runtime/samples/paren-wrapped-expressions/_config.js index 0c757dc854..972dc51cb0 100644 --- a/test/runtime/samples/paren-wrapped-expressions/_config.js +++ b/test/runtime/samples/paren-wrapped-expressions/_config.js @@ -2,7 +2,7 @@ export default { props: { a: 'foo', b: true, - c: [ 1, 2, 3 ], + c: [ 1, 2, 3 ] }, html: ` diff --git a/test/runtime/samples/prop-exports/_config.js b/test/runtime/samples/prop-exports/_config.js index e1620c015f..69a40c4fab 100644 --- a/test/runtime/samples/prop-exports/_config.js +++ b/test/runtime/samples/prop-exports/_config.js @@ -10,7 +10,7 @@ export default { a2: 4, a6: writable(29), for: 'loop', - continue: '...', + continue: '...' }, html: ` diff --git a/test/runtime/samples/props-reactive-only-with-change/Comp.svelte b/test/runtime/samples/props-reactive-only-with-change/Comp.svelte new file mode 100644 index 0000000000..0eaf8a40d4 --- /dev/null +++ b/test/runtime/samples/props-reactive-only-with-change/Comp.svelte @@ -0,0 +1,6 @@ + \ No newline at end of file diff --git a/test/runtime/samples/props-reactive-only-with-change/_config.js b/test/runtime/samples/props-reactive-only-with-change/_config.js new file mode 100644 index 0000000000..d2e86e583d --- /dev/null +++ b/test/runtime/samples/props-reactive-only-with-change/_config.js @@ -0,0 +1,30 @@ +let callbacks = []; + +export default { + props: { + callback: (value) => callbacks.push(value), + val1: "1", + val2: "2" + }, + + before_test() { + callbacks = []; + }, + + async test({ assert, component, target }) { + assert.equal(callbacks.length, 2); + assert.equal(JSON.stringify(callbacks), '["1","2"]'); + + component.val1 = "3"; + assert.equal(callbacks.length, 3); + assert.equal(JSON.stringify(callbacks), '["1","2","1"]'); + + component.val1 = "4"; + assert.equal(callbacks.length, 4); + assert.equal(JSON.stringify(callbacks), '["1","2","1","1"]'); + + component.val2 = "5"; + assert.equal(callbacks.length, 5); + assert.equal(JSON.stringify(callbacks), '["1","2","1","1","2"]'); + } +}; diff --git a/test/runtime/samples/props-reactive-only-with-change/main.svelte b/test/runtime/samples/props-reactive-only-with-change/main.svelte new file mode 100644 index 0000000000..73ddd137f5 --- /dev/null +++ b/test/runtime/samples/props-reactive-only-with-change/main.svelte @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/test/runtime/samples/props-reactive-slot/Comp.svelte b/test/runtime/samples/props-reactive-slot/Comp.svelte new file mode 100644 index 0000000000..bf9e12a58a --- /dev/null +++ b/test/runtime/samples/props-reactive-slot/Comp.svelte @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/runtime/samples/props-reactive-slot/_config.js b/test/runtime/samples/props-reactive-slot/_config.js new file mode 100644 index 0000000000..8ee6ef69dc --- /dev/null +++ b/test/runtime/samples/props-reactive-slot/_config.js @@ -0,0 +1,21 @@ +export default { + html: ` +

hi

+ + `, + + async test({ assert, component, target, window }) { + const btn = target.querySelector("button"); + const clickEvent = new window.MouseEvent("click"); + + await btn.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` +

changed

+ + ` + ); + } +}; diff --git a/test/runtime/samples/props-reactive-slot/main.svelte b/test/runtime/samples/props-reactive-slot/main.svelte new file mode 100644 index 0000000000..84777bf8ab --- /dev/null +++ b/test/runtime/samples/props-reactive-slot/main.svelte @@ -0,0 +1,13 @@ + + + +

+ {props.someprop} +

+
+ + \ No newline at end of file diff --git a/test/runtime/samples/raw-mustache-as-root/RawMustache.svelte b/test/runtime/samples/raw-mustache-as-root/RawMustache.svelte new file mode 100644 index 0000000000..d94954f49b --- /dev/null +++ b/test/runtime/samples/raw-mustache-as-root/RawMustache.svelte @@ -0,0 +1,5 @@ + + +{@html content} \ No newline at end of file diff --git a/test/runtime/samples/raw-mustache-as-root/_config.js b/test/runtime/samples/raw-mustache-as-root/_config.js new file mode 100644 index 0000000000..e42fa7f517 --- /dev/null +++ b/test/runtime/samples/raw-mustache-as-root/_config.js @@ -0,0 +1,33 @@ +export default { + html: ` + +

Another first line

+

This line should be last.

+ `, + async test({ assert, target, window }) { + const btn = target.querySelector("button"); + const clickEvent = new window.MouseEvent("click"); + + await btn.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + +

First line

+

This line should be last.

+ ` + ); + + await btn.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + +

Another first line

+

This line should be last.

+ ` + ); + } +}; diff --git a/test/runtime/samples/raw-mustache-as-root/main.svelte b/test/runtime/samples/raw-mustache-as-root/main.svelte new file mode 100644 index 0000000000..7ccce0cd9b --- /dev/null +++ b/test/runtime/samples/raw-mustache-as-root/main.svelte @@ -0,0 +1,17 @@ + + + + + + +

This line should be last.

\ No newline at end of file diff --git a/test/runtime/samples/raw-mustache-inside-head/_config.js b/test/runtime/samples/raw-mustache-inside-head/_config.js new file mode 100644 index 0000000000..7923fc7238 --- /dev/null +++ b/test/runtime/samples/raw-mustache-inside-head/_config.js @@ -0,0 +1,16 @@ +export default { + async test({ assert, target, window }) { + const btn = target.querySelector("button"); + const clickEvent = new window.MouseEvent("click"); + + assert.equal(window.document.head.innerHTML.includes(''), true); + + await btn.dispatchEvent(clickEvent); + + assert.equal(window.document.head.innerHTML.includes(''), true); + + await btn.dispatchEvent(clickEvent); + + assert.equal(window.document.head.innerHTML.includes(''), true); + } +}; diff --git a/test/runtime/samples/raw-mustache-inside-head/main.svelte b/test/runtime/samples/raw-mustache-inside-head/main.svelte new file mode 100644 index 0000000000..25b9fdeee9 --- /dev/null +++ b/test/runtime/samples/raw-mustache-inside-head/main.svelte @@ -0,0 +1,16 @@ + + + + + + {@html content} + + diff --git a/test/runtime/samples/raw-mustache-inside-slot/Component.svelte b/test/runtime/samples/raw-mustache-inside-slot/Component.svelte new file mode 100644 index 0000000000..fcabccae48 --- /dev/null +++ b/test/runtime/samples/raw-mustache-inside-slot/Component.svelte @@ -0,0 +1,2 @@ + +

This line should be last.

\ No newline at end of file diff --git a/test/runtime/samples/raw-mustache-inside-slot/_config.js b/test/runtime/samples/raw-mustache-inside-slot/_config.js new file mode 100644 index 0000000000..e42fa7f517 --- /dev/null +++ b/test/runtime/samples/raw-mustache-inside-slot/_config.js @@ -0,0 +1,33 @@ +export default { + html: ` + +

Another first line

+

This line should be last.

+ `, + async test({ assert, target, window }) { + const btn = target.querySelector("button"); + const clickEvent = new window.MouseEvent("click"); + + await btn.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + +

First line

+

This line should be last.

+ ` + ); + + await btn.dispatchEvent(clickEvent); + + assert.htmlEqual( + target.innerHTML, + ` + +

Another first line

+

This line should be last.

+ ` + ); + } +}; diff --git a/test/runtime/samples/raw-mustache-inside-slot/main.svelte b/test/runtime/samples/raw-mustache-inside-slot/main.svelte new file mode 100644 index 0000000000..a022a68e95 --- /dev/null +++ b/test/runtime/samples/raw-mustache-inside-slot/main.svelte @@ -0,0 +1,17 @@ + + + + + + {@html content} + \ No newline at end of file diff --git a/test/runtime/samples/raw-mustaches-td-tr/_config.js b/test/runtime/samples/raw-mustaches-td-tr/_config.js new file mode 100644 index 0000000000..1bcad157f3 --- /dev/null +++ b/test/runtime/samples/raw-mustaches-td-tr/_config.js @@ -0,0 +1,18 @@ +export default { + props: { + raw: "12" + }, + + html: ` + + + + + + + + + +
57
12
+ ` +}; diff --git a/test/runtime/samples/raw-mustaches-td-tr/main.svelte b/test/runtime/samples/raw-mustaches-td-tr/main.svelte new file mode 100644 index 0000000000..07d7299e43 --- /dev/null +++ b/test/runtime/samples/raw-mustaches-td-tr/main.svelte @@ -0,0 +1,12 @@ + + + + + + + + {@html raw} + +
57
\ No newline at end of file diff --git a/test/runtime/samples/reactive-function-called-reassigned/_config.js b/test/runtime/samples/reactive-function-called-reassigned/_config.js new file mode 100644 index 0000000000..7b2a8b72fe --- /dev/null +++ b/test/runtime/samples/reactive-function-called-reassigned/_config.js @@ -0,0 +1,27 @@ +let value; +let called = 0; +function callback(_value) { + called ++; + value = _value; +} + +export default { + props: { + callback + }, + async test({ assert, component, target, window }) { + assert.equal(called, 1); + + const input = target.querySelector('input'); + + const event = new window.Event('input'); + input.value = 'h'; + await input.dispatchEvent(event); + + assert.equal(called, 2); + assert.equal(value.length, 3); + assert.equal(value[0], 'h'); + assert.equal(value[1], '2'); + assert.equal(value[2], '3'); + } +}; diff --git a/test/runtime/samples/reactive-function-called-reassigned/main.svelte b/test/runtime/samples/reactive-function-called-reassigned/main.svelte new file mode 100644 index 0000000000..10a3c79d14 --- /dev/null +++ b/test/runtime/samples/reactive-function-called-reassigned/main.svelte @@ -0,0 +1,10 @@ + + +{#each refs as ref} + +{/each} \ No newline at end of file diff --git a/test/runtime/samples/reactive-import-statement/_config.js b/test/runtime/samples/reactive-import-statement/_config.js index 7fb8097ca5..45a844afa0 100644 --- a/test/runtime/samples/reactive-import-statement/_config.js +++ b/test/runtime/samples/reactive-import-statement/_config.js @@ -11,7 +11,7 @@ export default { before_test() { delete require.cache[path.resolve(__dirname, 'data.js')]; }, - async test({ assert, target, window, }) { + async test({ assert, target, window }) { const btn = target.querySelector('button'); const clickEvent = new window.MouseEvent('click'); diff --git a/test/runtime/samples/reactive-value-assign-property/_config.js b/test/runtime/samples/reactive-value-assign-property/_config.js new file mode 100644 index 0000000000..b6d8bf51be --- /dev/null +++ b/test/runtime/samples/reactive-value-assign-property/_config.js @@ -0,0 +1,5 @@ +export default { + html: ` +

Hello world!

+ ` +}; diff --git a/test/runtime/samples/reactive-value-assign-property/main.svelte b/test/runtime/samples/reactive-value-assign-property/main.svelte new file mode 100644 index 0000000000..58e0fdb03c --- /dev/null +++ b/test/runtime/samples/reactive-value-assign-property/main.svelte @@ -0,0 +1,6 @@ + + +

Hello {user.name}!

\ No newline at end of file diff --git a/test/runtime/samples/self-reference-component/_config.js b/test/runtime/samples/self-reference-component/_config.js index e3e0ad3a4f..e9cd0ac440 100644 --- a/test/runtime/samples/self-reference-component/_config.js +++ b/test/runtime/samples/self-reference-component/_config.js @@ -1,3 +1,3 @@ export default { - html: '5 4 3 2 1 0', + html: '5 4 3 2 1 0' }; \ No newline at end of file diff --git a/test/runtime/samples/set-undefined-attr/_config.js b/test/runtime/samples/set-undefined-attr/_config.js index b23f51dfc9..a0df368e65 100644 --- a/test/runtime/samples/set-undefined-attr/_config.js +++ b/test/runtime/samples/set-undefined-attr/_config.js @@ -1,5 +1,5 @@ export default { html: `
`, - ssrHtml: `
`, + ssrHtml: `
` }; diff --git a/test/runtime/samples/sigil-component-prop/_config.js b/test/runtime/samples/sigil-component-prop/_config.js index 2f467bb9d4..9f84a59994 100644 --- a/test/runtime/samples/sigil-component-prop/_config.js +++ b/test/runtime/samples/sigil-component-prop/_config.js @@ -3,5 +3,5 @@ export default { dev: true }, props: { foo: 'foo' }, - html: `
foo @ foo # foo
`, + html: `
foo @ foo # foo
` }; diff --git a/test/runtime/samples/slot-if-block-update-no-anchor/_config.js b/test/runtime/samples/slot-if-block-update-no-anchor/_config.js index 060cbaa619..58d2b49ade 100644 --- a/test/runtime/samples/slot-if-block-update-no-anchor/_config.js +++ b/test/runtime/samples/slot-if-block-update-no-anchor/_config.js @@ -3,5 +3,5 @@ export default { assert.htmlEqual(target.innerHTML, ``); component.enabled = true; assert.htmlEqual(target.innerHTML, `enabled`); - }, + } }; diff --git a/test/runtime/samples/spread-component-2/_config.js b/test/runtime/samples/spread-component-2/_config.js index 6d36e8e60d..e5441bc4b9 100644 --- a/test/runtime/samples/spread-component-2/_config.js +++ b/test/runtime/samples/spread-component-2/_config.js @@ -10,7 +10,7 @@ export default { baz: 50 + 2, qux: 1, quux: 'quuxx' - }], + }] }, html: ` diff --git a/test/runtime/samples/spread-component-dynamic-non-object-multiple-dependencies/_config.js b/test/runtime/samples/spread-component-dynamic-non-object-multiple-dependencies/_config.js index c5e23a023c..d7ad47b01f 100644 --- a/test/runtime/samples/spread-component-dynamic-non-object-multiple-dependencies/_config.js +++ b/test/runtime/samples/spread-component-dynamic-non-object-multiple-dependencies/_config.js @@ -2,7 +2,7 @@ export default { props: { props: { foo: 'lol', - baz: 40 + 2, + baz: 40 + 2 } }, diff --git a/test/runtime/samples/spread-component-dynamic-non-object/_config.js b/test/runtime/samples/spread-component-dynamic-non-object/_config.js index 094f2fbb9b..fa8de8ad94 100644 --- a/test/runtime/samples/spread-component-dynamic-non-object/_config.js +++ b/test/runtime/samples/spread-component-dynamic-non-object/_config.js @@ -2,7 +2,7 @@ export default { props: { props: { foo: 'lol', - baz: 40 + 2, + baz: 40 + 2 } }, diff --git a/test/runtime/samples/spread-component-dynamic-undefined/_config.js b/test/runtime/samples/spread-component-dynamic-undefined/_config.js index 09e5f87c14..e7e205a34b 100644 --- a/test/runtime/samples/spread-component-dynamic-undefined/_config.js +++ b/test/runtime/samples/spread-component-dynamic-undefined/_config.js @@ -1,17 +1,17 @@ export default { props: { props: { - a: 1, - }, + a: 1 + } }, html: ``, test({ assert, component, target }) { component.props = { - a: 2, + a: 2 }; assert.htmlEqual(target.innerHTML, ``); - }, + } }; diff --git a/test/runtime/samples/spread-component-dynamic/_config.js b/test/runtime/samples/spread-component-dynamic/_config.js index a6bf952ae0..08df27e1c2 100644 --- a/test/runtime/samples/spread-component-dynamic/_config.js +++ b/test/runtime/samples/spread-component-dynamic/_config.js @@ -1,8 +1,8 @@ export default { props: { props: { - a: 1, - }, + a: 1 + } }, html: ` @@ -11,9 +11,9 @@ export default { test({ assert, component, target }) { component.props = { - a: 2, + a: 2 }; assert.htmlEqual(target.innerHTML, `

a: 2

`); - }, + } }; diff --git a/test/runtime/samples/spread-component-multiple-dependencies/_config.js b/test/runtime/samples/spread-component-multiple-dependencies/_config.js index bc05f31130..070916ebd8 100644 --- a/test/runtime/samples/spread-component-multiple-dependencies/_config.js +++ b/test/runtime/samples/spread-component-multiple-dependencies/_config.js @@ -6,5 +6,5 @@ export default { target.innerHTML, `a baz` ); - }, + } }; diff --git a/test/runtime/samples/spread-each-component/_config.js b/test/runtime/samples/spread-each-component/_config.js index bc4d8ee7a4..66d2381875 100644 --- a/test/runtime/samples/spread-each-component/_config.js +++ b/test/runtime/samples/spread-each-component/_config.js @@ -20,5 +20,5 @@ export default {
`); - }, + } }; diff --git a/test/runtime/samples/spread-each-element/_config.js b/test/runtime/samples/spread-each-element/_config.js index 5dbd82a892..579f840099 100644 --- a/test/runtime/samples/spread-each-element/_config.js +++ b/test/runtime/samples/spread-each-element/_config.js @@ -20,5 +20,5 @@ export default {
`); - }, + } }; diff --git a/test/runtime/samples/spread-element-boolean/_config.js b/test/runtime/samples/spread-element-boolean/_config.js index 3ee277eec4..d336dae029 100644 --- a/test/runtime/samples/spread-element-boolean/_config.js +++ b/test/runtime/samples/spread-element-boolean/_config.js @@ -21,5 +21,5 @@ export default { `` ); assert.ok(!button.disabled); - }, + } }; diff --git a/test/runtime/samples/spread-element-input-select-multiple/_config.js b/test/runtime/samples/spread-element-input-select-multiple/_config.js new file mode 100644 index 0000000000..1ddcd9eb6d --- /dev/null +++ b/test/runtime/samples/spread-element-input-select-multiple/_config.js @@ -0,0 +1,39 @@ +export default { + async test({ assert, component, target, window }) { + const [input1, input2] = target.querySelectorAll('input'); + const select = target.querySelector('select'); + const [option1, option2] = select.childNodes; + + let selections = Array.from(select.selectedOptions); + assert.equal(selections.length, 2); + assert.ok(selections.includes(option1)); + assert.ok(selections.includes(option2)); + + const event = new window.Event('change'); + + input1.checked = false; + await input1.dispatchEvent(event); + + selections = Array.from(select.selectedOptions); + assert.equal(selections.length, 1); + assert.ok(!selections.includes(option1)); + assert.ok(selections.includes(option2)); + + input2.checked = false; + await input2.dispatchEvent(event); + input1.checked = true; + await input1.dispatchEvent(event); + + selections = Array.from(select.selectedOptions); + assert.equal(selections.length, 1); + assert.ok(selections.includes(option1)); + assert.ok(!selections.includes(option2)); + + component.spread = { value: ['Hello', 'World'] }; + + selections = Array.from(select.selectedOptions); + assert.equal(selections.length, 2); + assert.ok(selections.includes(option1)); + assert.ok(selections.includes(option2)); + } +}; diff --git a/test/runtime/samples/spread-element-input-select-multiple/main.svelte b/test/runtime/samples/spread-element-input-select-multiple/main.svelte new file mode 100644 index 0000000000..d2fb12dd20 --- /dev/null +++ b/test/runtime/samples/spread-element-input-select-multiple/main.svelte @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/test/runtime/samples/spread-element-input-value-undefined/_config.js b/test/runtime/samples/spread-element-input-value-undefined/_config.js new file mode 100644 index 0000000000..d66e215cde --- /dev/null +++ b/test/runtime/samples/spread-element-input-value-undefined/_config.js @@ -0,0 +1,12 @@ +export default { + async test({ assert, component, target, window }) { + const input = target.querySelector("input"); + component.value = undefined; + + assert.equal(input.value, "undefined"); + + component.value = "foobar"; + + assert.equal(input.value, "foobar"); + } +}; diff --git a/test/runtime/samples/spread-element-input-value-undefined/main.svelte b/test/runtime/samples/spread-element-input-value-undefined/main.svelte new file mode 100644 index 0000000000..5c9121dc03 --- /dev/null +++ b/test/runtime/samples/spread-element-input-value-undefined/main.svelte @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/test/runtime/samples/spread-element-input-value/InputOne.svelte b/test/runtime/samples/spread-element-input-value/InputOne.svelte new file mode 100644 index 0000000000..92ecb7b9a9 --- /dev/null +++ b/test/runtime/samples/spread-element-input-value/InputOne.svelte @@ -0,0 +1,18 @@ + + + diff --git a/test/runtime/samples/spread-element-input-value/InputTwo.svelte b/test/runtime/samples/spread-element-input-value/InputTwo.svelte new file mode 100644 index 0000000000..33ec0622a4 --- /dev/null +++ b/test/runtime/samples/spread-element-input-value/InputTwo.svelte @@ -0,0 +1,19 @@ + + + diff --git a/test/runtime/samples/spread-element-input-value/_config.js b/test/runtime/samples/spread-element-input-value/_config.js new file mode 100644 index 0000000000..abb63ceab3 --- /dev/null +++ b/test/runtime/samples/spread-element-input-value/_config.js @@ -0,0 +1,62 @@ +export default { + async test({ assert, component, target, window }) { + const [input1, input2] = target.querySelectorAll("input"); + + // we are not able emulate user interaction in jsdom, + // therefore, jsdom could not validate minlength / maxlength + + // we simulate user input with + // setting input.value + dispathEvent + + // and we determine if svelte does not set the `input.value` again by + // spying on the setter of `input.value` + + const spy1 = spyOnValueSetter(input1, input1.value); + const spy2 = spyOnValueSetter(input2, input2.value); + + const event = new window.Event("input"); + + input1.value = '12345'; + spy1.reset(); + await input1.dispatchEvent(event); + + assert.ok(!spy1.isSetCalled()); + + input2.value = '12345'; + spy2.reset(); + await input2.dispatchEvent(event); + + assert.ok(!spy2.isSetCalled()); + + spy1.reset(); + component.val1 = '56789'; + assert.ok(spy1.isSetCalled()); + + spy2.reset(); + component.val2 = '56789'; + assert.ok(spy2.isSetCalled()); + } +}; + +function spyOnValueSetter(input, initialValue) { + let value = initialValue; + let isSet = false; + Object.defineProperty(input, "value", { + get() { + return value; + }, + set(_value) { + value = _value; + isSet = true; + } + }); + + return { + isSetCalled() { + return isSet; + }, + reset() { + isSet = false; + } + }; +} diff --git a/test/runtime/samples/spread-element-input-value/main.svelte b/test/runtime/samples/spread-element-input-value/main.svelte new file mode 100644 index 0000000000..bb5f0e00bf --- /dev/null +++ b/test/runtime/samples/spread-element-input-value/main.svelte @@ -0,0 +1,9 @@ + + + + \ No newline at end of file diff --git a/test/runtime/samples/spread-element-input-value/utils.js b/test/runtime/samples/spread-element-input-value/utils.js new file mode 100644 index 0000000000..ee941bda55 --- /dev/null +++ b/test/runtime/samples/spread-element-input-value/utils.js @@ -0,0 +1,6 @@ +export function omit(obj, ...keysToOmit) { + return Object.keys(obj).reduce((acc, key) => { + if (keysToOmit.indexOf(key) === -1) acc[key] = obj[key]; + return acc; + }, {}); +} diff --git a/test/runtime/samples/spread-element-multiple-dependencies/_config.js b/test/runtime/samples/spread-element-multiple-dependencies/_config.js index 69ef1f8ebe..480eb6621c 100644 --- a/test/runtime/samples/spread-element-multiple-dependencies/_config.js +++ b/test/runtime/samples/spread-element-multiple-dependencies/_config.js @@ -6,5 +6,5 @@ export default { target.innerHTML, `
` ); - }, + } }; diff --git a/test/runtime/samples/spread-element-multiple/_config.js b/test/runtime/samples/spread-element-multiple/_config.js index 641f74d727..0c04b16d40 100644 --- a/test/runtime/samples/spread-element-multiple/_config.js +++ b/test/runtime/samples/spread-element-multiple/_config.js @@ -2,12 +2,12 @@ export default { props: { a: { 'data-one': 1, - 'data-two': 2, + 'data-two': 2 }, c: { - 'data-b': 'overridden', + 'data-b': 'overridden' }, - d: 'deeeeee', + d: 'deeeeee' }, html: ` @@ -27,5 +27,5 @@ export default { target.innerHTML, `
test
` ); - }, + } }; diff --git a/test/runtime/samples/store-auto-subscribe-event-callback/_config.js b/test/runtime/samples/store-auto-subscribe-event-callback/_config.js index 747ed3e4ad..7897036809 100644 --- a/test/runtime/samples/store-auto-subscribe-event-callback/_config.js +++ b/test/runtime/samples/store-auto-subscribe-event-callback/_config.js @@ -18,5 +18,5 @@ export default { Dirty: true Valid: true `); - }, + } }; diff --git a/test/runtime/samples/store-each-binding-deep/_config.js b/test/runtime/samples/store-each-binding-deep/_config.js new file mode 100644 index 0000000000..70776940dd --- /dev/null +++ b/test/runtime/samples/store-each-binding-deep/_config.js @@ -0,0 +1,14 @@ +export default { + async test({ assert, target, window }) { + const input = target.querySelector('input'); + + const event = new window.Event('input'); + input.value = 'changed'; + await input.dispatchEvent(event); + + assert.htmlEqual(target.innerHTML, ` + +

changed

+ `); + } +}; \ No newline at end of file diff --git a/test/runtime/samples/store-each-binding-deep/main.svelte b/test/runtime/samples/store-each-binding-deep/main.svelte new file mode 100644 index 0000000000..8f1cabf5b8 --- /dev/null +++ b/test/runtime/samples/store-each-binding-deep/main.svelte @@ -0,0 +1,11 @@ + + +{#each $itemStore.prop.things as thing } + +{/each} + +

{$itemStore.prop.things[0].name}

\ No newline at end of file diff --git a/test/runtime/samples/store-imports-hoisted/_config.js b/test/runtime/samples/store-imports-hoisted/_config.js new file mode 100644 index 0000000000..251866e5ba --- /dev/null +++ b/test/runtime/samples/store-imports-hoisted/_config.js @@ -0,0 +1,7 @@ +export default { + compileOptions: { dev: true }, // tests `@validate_store` code generation + + html: ` +

42

+ ` +}; \ No newline at end of file diff --git a/test/runtime/samples/store-imports-hoisted/foo.js b/test/runtime/samples/store-imports-hoisted/foo.js new file mode 100644 index 0000000000..5d15213c3a --- /dev/null +++ b/test/runtime/samples/store-imports-hoisted/foo.js @@ -0,0 +1,3 @@ +import { writable } from '../../../../store'; + +export default writable(42); \ No newline at end of file diff --git a/test/runtime/samples/store-imports-hoisted/main.svelte b/test/runtime/samples/store-imports-hoisted/main.svelte new file mode 100644 index 0000000000..223572962e --- /dev/null +++ b/test/runtime/samples/store-imports-hoisted/main.svelte @@ -0,0 +1,7 @@ + + +

{answer}

diff --git a/test/runtime/samples/store-resubscribe-b/_config.js b/test/runtime/samples/store-resubscribe-b/_config.js index d043bbcd87..dd11a863f2 100644 --- a/test/runtime/samples/store-resubscribe-b/_config.js +++ b/test/runtime/samples/store-resubscribe-b/_config.js @@ -1,3 +1,3 @@ export default { - html: `42`, + html: `42` }; diff --git a/test/runtime/samples/store-resubscribe-export/_config.js b/test/runtime/samples/store-resubscribe-export/_config.js index b6e6f11344..3c8473b3e1 100644 --- a/test/runtime/samples/store-resubscribe-export/_config.js +++ b/test/runtime/samples/store-resubscribe-export/_config.js @@ -6,14 +6,14 @@ const fakeStore = val => ({ return { unsubscribe: () => { subscribeCalled = true; - }, + } }; - }, + } }); export default { props: { - foo: fakeStore(1), + foo: fakeStore(1) }, html: `

1

@@ -23,5 +23,5 @@ export default { component.foo = fakeStore(5); return assert.htmlEqual(target.innerHTML, `

5

`); - }, + } }; diff --git a/test/runtime/samples/store-resubscribe-observable/_config.js b/test/runtime/samples/store-resubscribe-observable/_config.js index d043bbcd87..dd11a863f2 100644 --- a/test/runtime/samples/store-resubscribe-observable/_config.js +++ b/test/runtime/samples/store-resubscribe-observable/_config.js @@ -1,3 +1,3 @@ export default { - html: `42`, + html: `42` }; diff --git a/test/runtime/samples/store-shadow-scope/_config.js b/test/runtime/samples/store-shadow-scope/_config.js new file mode 100644 index 0000000000..e2d6fc7808 --- /dev/null +++ b/test/runtime/samples/store-shadow-scope/_config.js @@ -0,0 +1,3 @@ +export default { + error: `Stores must be declared at the top level of the component (this may change in a future version of Svelte)` +}; diff --git a/test/runtime/samples/store-shadow-scope/main.svelte b/test/runtime/samples/store-shadow-scope/main.svelte new file mode 100644 index 0000000000..72c4a06c2a --- /dev/null +++ b/test/runtime/samples/store-shadow-scope/main.svelte @@ -0,0 +1,9 @@ + diff --git a/test/runtime/samples/store-template-expression-scope/_config.js b/test/runtime/samples/store-template-expression-scope/_config.js new file mode 100644 index 0000000000..e2d6fc7808 --- /dev/null +++ b/test/runtime/samples/store-template-expression-scope/_config.js @@ -0,0 +1,3 @@ +export default { + error: `Stores must be declared at the top level of the component (this may change in a future version of Svelte)` +}; diff --git a/test/runtime/samples/store-template-expression-scope/main.svelte b/test/runtime/samples/store-template-expression-scope/main.svelte new file mode 100644 index 0000000000..1c9ccb2933 --- /dev/null +++ b/test/runtime/samples/store-template-expression-scope/main.svelte @@ -0,0 +1,9 @@ + + + + diff --git a/test/validator/samples/a11y-label-has-associated-control/warnings.json b/test/validator/samples/a11y-label-has-associated-control/warnings.json new file mode 100644 index 0000000000..b70a1a47de --- /dev/null +++ b/test/validator/samples/a11y-label-has-associated-control/warnings.json @@ -0,0 +1,32 @@ +[ + { + "code": "a11y-label-has-associated-control", + "end": { + "character": 16, + "column": 16, + "line": 1 + }, + "message": "A11y: A form label must be associated with a control.", + "pos": 0, + "start": { + "character": 0, + "column": 0, + "line": 1 + } + }, + { + "code": "a11y-label-has-associated-control", + "end": { + "character": 149, + "column": 30, + "line": 6 + }, + "message": "A11y: A form label must be associated with a control.", + "pos": 119, + "start": { + "character": 119, + "column": 0, + "line": 6 + } + } +] diff --git a/test/validator/samples/a11y-media-has-caption/input.svelte b/test/validator/samples/a11y-media-has-caption/input.svelte new file mode 100644 index 0000000000..105269cddb --- /dev/null +++ b/test/validator/samples/a11y-media-has-caption/input.svelte @@ -0,0 +1,4 @@ + + + + diff --git a/test/validator/samples/a11y-media-has-caption/warnings.json b/test/validator/samples/a11y-media-has-caption/warnings.json new file mode 100644 index 0000000000..a8c894b1d4 --- /dev/null +++ b/test/validator/samples/a11y-media-has-caption/warnings.json @@ -0,0 +1,32 @@ +[ + { + "code": "a11y-media-has-caption", + "end": { + "character": 55, + "column": 15, + "line": 2 + }, + "message": "A11y: Media elements must have a ", + "pos": 40, + "start": { + "character": 40, + "column": 0, + "line": 2 + } + }, + { + "code": "a11y-media-has-caption", + "end": { + "character": 80, + "column": 24, + "line": 3 + }, + "message": "A11y: Media elements must have a ", + "pos": 56, + "start": { + "character": 56, + "column": 0, + "line": 3 + } + } +] diff --git a/test/vars/samples/assumed-global/_config.js b/test/vars/samples/assumed-global/_config.js index 2b84e83f12..782760bb8b 100644 --- a/test/vars/samples/assumed-global/_config.js +++ b/test/vars/samples/assumed-global/_config.js @@ -1,5 +1,5 @@ export default { test(assert, vars) { assert.deepEqual(vars, []); - }, + } }; diff --git a/test/vars/samples/duplicate-globals/_config.js b/test/vars/samples/duplicate-globals/_config.js index 2b84e83f12..782760bb8b 100644 --- a/test/vars/samples/duplicate-globals/_config.js +++ b/test/vars/samples/duplicate-globals/_config.js @@ -1,5 +1,5 @@ export default { test(assert, vars) { assert.deepEqual(vars, []); - }, + } }; diff --git a/test/vars/samples/duplicate-non-hoistable/_config.js b/test/vars/samples/duplicate-non-hoistable/_config.js index 4ebc5b00cf..bd70e29800 100644 --- a/test/vars/samples/duplicate-non-hoistable/_config.js +++ b/test/vars/samples/duplicate-non-hoistable/_config.js @@ -13,5 +13,5 @@ export default { writable: true } ]); - }, + } }; diff --git a/test/vars/samples/duplicate-vars/_config.js b/test/vars/samples/duplicate-vars/_config.js index eb10c44a9a..749a0c59af 100644 --- a/test/vars/samples/duplicate-vars/_config.js +++ b/test/vars/samples/duplicate-vars/_config.js @@ -24,5 +24,5 @@ export default { writable: true } ]); - }, + } }; diff --git a/test/vars/samples/implicit-reactive/_config.js b/test/vars/samples/implicit-reactive/_config.js index 770de590e6..a8bf261d4f 100644 --- a/test/vars/samples/implicit-reactive/_config.js +++ b/test/vars/samples/implicit-reactive/_config.js @@ -24,5 +24,5 @@ export default { writable: true } ]); - }, + } }; diff --git a/test/vars/samples/referenced-from-script/_config.js b/test/vars/samples/referenced-from-script/_config.js index 191a52f8cc..ec068cb1d7 100644 --- a/test/vars/samples/referenced-from-script/_config.js +++ b/test/vars/samples/referenced-from-script/_config.js @@ -10,7 +10,7 @@ export default { reassigned: false, referenced: false, writable: false, - referenced_from_script: false, + referenced_from_script: false }, { name: 'j', @@ -21,7 +21,7 @@ export default { reassigned: false, referenced: false, writable: false, - referenced_from_script: false, + referenced_from_script: false }, { name: 'k', @@ -32,7 +32,7 @@ export default { reassigned: false, referenced: false, writable: false, - referenced_from_script: false, + referenced_from_script: false }, { name: 'a', @@ -43,7 +43,7 @@ export default { reassigned: true, referenced: false, writable: true, - referenced_from_script: true, + referenced_from_script: true }, { name: 'b', @@ -54,7 +54,7 @@ export default { reassigned: false, referenced: false, writable: true, - referenced_from_script: true, + referenced_from_script: true }, { name: 'c', @@ -65,7 +65,7 @@ export default { reassigned: false, referenced: false, writable: true, - referenced_from_script: true, + referenced_from_script: true }, { name: 'd', @@ -76,7 +76,7 @@ export default { reassigned: false, referenced: false, writable: true, - referenced_from_script: true, + referenced_from_script: true }, { name: 'e', @@ -87,7 +87,7 @@ export default { reassigned: false, referenced: false, writable: true, - referenced_from_script: false, + referenced_from_script: false }, { name: 'f', @@ -98,7 +98,7 @@ export default { reassigned: false, referenced: false, writable: true, - referenced_from_script: false, + referenced_from_script: false }, { name: 'g', @@ -109,7 +109,7 @@ export default { reassigned: false, referenced: false, writable: true, - referenced_from_script: true, + referenced_from_script: true }, { name: 'h', @@ -120,7 +120,7 @@ export default { reassigned: true, referenced: false, writable: true, - referenced_from_script: true, + referenced_from_script: true }, { name: 'foo', @@ -131,7 +131,7 @@ export default { reassigned: false, referenced: false, writable: false, - referenced_from_script: false, + referenced_from_script: false }, { name: 'l', @@ -142,7 +142,7 @@ export default { reassigned: false, referenced: false, referenced_from_script: true, - writable: false, + writable: false }, { name: 'bar', @@ -153,8 +153,8 @@ export default { reassigned: false, referenced: false, writable: false, - referenced_from_script: false, - }, + referenced_from_script: false + } ]); - }, + } }; diff --git a/test/vars/samples/template-references/_config.js b/test/vars/samples/template-references/_config.js index 674e351517..34c07e19e0 100644 --- a/test/vars/samples/template-references/_config.js +++ b/test/vars/samples/template-references/_config.js @@ -10,7 +10,7 @@ export default { reassigned: false, referenced: true, referenced_from_script: false, - writable: false, + writable: false }, { export_name: null, @@ -21,7 +21,7 @@ export default { reassigned: false, referenced: true, referenced_from_script: false, - writable: true, + writable: true }, { export_name: null, @@ -32,8 +32,8 @@ export default { reassigned: false, referenced: true, referenced_from_script: false, - writable: true, - }, + writable: true + } ]); - }, + } }; diff --git a/test/vars/samples/undeclared/_config.js b/test/vars/samples/undeclared/_config.js index 2b84e83f12..782760bb8b 100644 --- a/test/vars/samples/undeclared/_config.js +++ b/test/vars/samples/undeclared/_config.js @@ -1,5 +1,5 @@ export default { test(assert, vars) { assert.deepEqual(vars, []); - }, + } };