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