mirror of https://github.com/sveltejs/svelte
commit
e8e0d7338d
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"svelte": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: consistently set value to blank string when value attribute is undefined
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'svelte': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: optimise || expressions in template
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'svelte': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: expand boolean attribute support
|
||||||
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"svelte": patch
|
||||||
|
---
|
||||||
|
|
||||||
|
fix: add check for `is` attribute to correctly detect custom elements
|
||||||
@ -1,26 +0,0 @@
|
|||||||
# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md
|
|
||||||
name: Docs preview create request
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dispatch:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Repository Dispatch
|
|
||||||
uses: peter-evans/repository-dispatch@v3
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.SYNC_REQUEST_TOKEN }}
|
|
||||||
repository: sveltejs/svelte.dev
|
|
||||||
event-type: docs-preview-create
|
|
||||||
client-payload: |-
|
|
||||||
{
|
|
||||||
"package": "svelte",
|
|
||||||
"repo": "${{ github.repository }}",
|
|
||||||
"owner": "${{ github.event.pull_request.head.repo.owner.login }}",
|
|
||||||
"branch": "${{ github.event.pull_request.head.ref }}",
|
|
||||||
"pr": ${{ github.event.pull_request.number }}
|
|
||||||
}
|
|
||||||
@ -1,27 +0,0 @@
|
|||||||
# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md
|
|
||||||
name: Docs preview delete request
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
types: [closed]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dispatch:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Repository Dispatch
|
|
||||||
uses: peter-evans/repository-dispatch@v3
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.SYNC_REQUEST_TOKEN }}
|
|
||||||
repository: sveltejs/svelte.dev
|
|
||||||
event-type: docs-preview-delete
|
|
||||||
client-payload: |-
|
|
||||||
{
|
|
||||||
"package": "svelte",
|
|
||||||
"repo": "${{ github.repository }}",
|
|
||||||
"owner": "${{ github.event.pull_request.head.repo.owner.login }}",
|
|
||||||
"branch": "${{ github.event.pull_request.head.ref }}",
|
|
||||||
"pr": ${{ github.event.pull_request.number }}
|
|
||||||
}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md
|
|
||||||
name: Sync request
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dispatch:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Repository Dispatch
|
|
||||||
uses: peter-evans/repository-dispatch@v3
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.SYNC_REQUEST_TOKEN }}
|
|
||||||
repository: sveltejs/svelte.dev
|
|
||||||
event-type: sync-request
|
|
||||||
client-payload: |-
|
|
||||||
{
|
|
||||||
"package": "svelte"
|
|
||||||
}
|
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
import { test } from '../../test';
|
||||||
|
|
||||||
|
export default test({
|
||||||
|
// JSDOM lacks support for some of these attributes, so we'll skip it for now.
|
||||||
|
//
|
||||||
|
// See:
|
||||||
|
// - `async`: https://github.com/jsdom/jsdom/issues/1564
|
||||||
|
// - `nomodule`: https://github.com/jsdom/jsdom/issues/2475
|
||||||
|
// - `autofocus`: https://github.com/jsdom/jsdom/issues/3041
|
||||||
|
// - `inert`: https://github.com/jsdom/jsdom/issues/3605
|
||||||
|
// - etc...: https://github.com/jestjs/jest/issues/139#issuecomment-592673550
|
||||||
|
skip_mode: ['client'],
|
||||||
|
|
||||||
|
html: `
|
||||||
|
<script nomodule async defer></script>
|
||||||
|
<form novalidate></form>
|
||||||
|
<input readonly required checked webkitdirectory>
|
||||||
|
<select multiple disabled></select>
|
||||||
|
<button formnovalidate></button>
|
||||||
|
<img ismap>
|
||||||
|
<video autoplay controls loop muted playsinline disablepictureinpicture disableremoteplayback></video>
|
||||||
|
<audio disableremoteplayback></audio>
|
||||||
|
<track default>
|
||||||
|
<iframe allowfullscreen></iframe>
|
||||||
|
<details open></details>
|
||||||
|
<ol reversed></ol>
|
||||||
|
<div autofocus></div>
|
||||||
|
<span inert></span>
|
||||||
|
|
||||||
|
<script nomodule async defer></script>
|
||||||
|
<form novalidate></form>
|
||||||
|
<input readonly required checked webkitdirectory>
|
||||||
|
<select multiple disabled></select>
|
||||||
|
<button formnovalidate></button>
|
||||||
|
<img ismap>
|
||||||
|
<video autoplay controls loop muted playsinline disablepictureinpicture disableremoteplayback></video>
|
||||||
|
<audio disableremoteplayback></audio>
|
||||||
|
<track default>
|
||||||
|
<iframe allowfullscreen></iframe>
|
||||||
|
<details open></details>
|
||||||
|
<ol reversed></ol>
|
||||||
|
<div autofocus></div>
|
||||||
|
<span inert></span>
|
||||||
|
|
||||||
|
<script></script>
|
||||||
|
<form></form>
|
||||||
|
<input>
|
||||||
|
<select></select>
|
||||||
|
<button></button>
|
||||||
|
<img>
|
||||||
|
<video></video>
|
||||||
|
<audio></audio>
|
||||||
|
<track>
|
||||||
|
<iframe></iframe>
|
||||||
|
<details></details>
|
||||||
|
<ol></ol>
|
||||||
|
<div></div>
|
||||||
|
<span></span>
|
||||||
|
`
|
||||||
|
});
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
<script>
|
||||||
|
let runesMode = $state('using a rune so that we trigger runes mode');
|
||||||
|
|
||||||
|
const attributeValues = [true, 'test', false];
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{#each attributeValues as val}
|
||||||
|
<script NOMODULE={val} ASYNC={val} DEFER={val}></script>
|
||||||
|
<form NOVALIDATE={val}></form>
|
||||||
|
<input READONLY={val} REQUIRED={val} CHECKED={val} WEBKITDIRECTORY={val} />
|
||||||
|
<select MULTIPLE={val} DISABLED={val}></select>
|
||||||
|
<button FORMNOVALIDATE={val}></button>
|
||||||
|
<img ISMAP={val} />
|
||||||
|
<video AUTOPLAY={val} CONTROLS={val} LOOP={val} MUTED={val} PLAYSINLINE={val} DISABLEPICTUREINPICTURE={val} DISABLEREMOTEPLAYBACK={val}></video>
|
||||||
|
<audio DISABLEREMOTEPLAYBACK={val}></audio>
|
||||||
|
<track DEFAULT={val} />
|
||||||
|
<iframe ALLOWFULLSCREEN={val}></iframe>
|
||||||
|
<details OPEN={val}></details>
|
||||||
|
<ol REVERSED={val}></ol>
|
||||||
|
<div AUTOFOCUS={val}></div>
|
||||||
|
<span INERT={val}></span>
|
||||||
|
{/each}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
import { test } from '../../test';
|
||||||
|
|
||||||
|
export default test({
|
||||||
|
mode: ['client', 'server'],
|
||||||
|
async test({ assert, target }) {
|
||||||
|
const my_element = /** @type HTMLElement & { object: { test: true }; } */ (
|
||||||
|
target.querySelector('my-element')
|
||||||
|
);
|
||||||
|
const my_link = /** @type HTMLAnchorElement & { object: { test: true }; } */ (
|
||||||
|
target.querySelector('a')
|
||||||
|
);
|
||||||
|
assert.equal(my_element.getAttribute('string'), 'test');
|
||||||
|
assert.equal(my_element.hasAttribute('object'), false);
|
||||||
|
assert.deepEqual(my_element.object, { test: true });
|
||||||
|
assert.equal(my_link.getAttribute('string'), 'test');
|
||||||
|
assert.equal(my_link.hasAttribute('object'), false);
|
||||||
|
assert.deepEqual(my_link.object, { test: true });
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
<my-element string="test" object={{ test: true }}></my-element>
|
||||||
|
<a is="my-link" string="test" object={{ test: true }}></a>
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
import { test, ok } from '../../test';
|
||||||
|
import { flushSync } from 'svelte';
|
||||||
|
|
||||||
|
export default test({
|
||||||
|
mode: ['client'],
|
||||||
|
|
||||||
|
async test({ assert, target }) {
|
||||||
|
/**
|
||||||
|
* @type {HTMLInputElement | null}
|
||||||
|
*/
|
||||||
|
const input = target.querySelector('input[type=text]');
|
||||||
|
/**
|
||||||
|
* @type {HTMLButtonElement | null}
|
||||||
|
*/
|
||||||
|
const setString = target.querySelector('#setString');
|
||||||
|
/**
|
||||||
|
* @type {HTMLButtonElement | null}
|
||||||
|
*/
|
||||||
|
const setNull = target.querySelector('#setNull');
|
||||||
|
/**
|
||||||
|
* @type {HTMLButtonElement | null}
|
||||||
|
*/
|
||||||
|
const setUndefined = target.querySelector('#setUndefined');
|
||||||
|
|
||||||
|
ok(input);
|
||||||
|
ok(setString);
|
||||||
|
ok(setNull);
|
||||||
|
ok(setUndefined);
|
||||||
|
|
||||||
|
// value should always be blank string when value attribute is set to null or undefined
|
||||||
|
|
||||||
|
assert.equal(input.value, '');
|
||||||
|
setString.click();
|
||||||
|
flushSync();
|
||||||
|
assert.equal(input.value, 'foo');
|
||||||
|
|
||||||
|
setNull.click();
|
||||||
|
flushSync();
|
||||||
|
assert.equal(input.value, '');
|
||||||
|
|
||||||
|
setString.click();
|
||||||
|
flushSync();
|
||||||
|
assert.equal(input.value, 'foo');
|
||||||
|
|
||||||
|
setUndefined.click();
|
||||||
|
flushSync();
|
||||||
|
assert.equal(input.value, '');
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
<script>
|
||||||
|
let value = $state();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<input type="text" {value} />
|
||||||
|
|
||||||
|
<button id="setString" onclick={() => {value = "foo";}}></button>
|
||||||
|
<button id="setNull" onclick={() => {value = null;}}></button>
|
||||||
|
<button id="setUndefined" onclick={() => {value = undefined;}}></button>
|
||||||
Loading…
Reference in new issue