mirror of https://github.com/sveltejs/svelte
commit
0fa394fec5
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: block template store subscriptions on the promise that assigns the store
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: route $derived teardown errors through invoke_error_boundary
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: track SvelteDate snapshots in reactions
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: remove `<svelte:head>` anchors on unmount
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: warn on undeclared shorthand event handlers on `<svelte:window>`, `<svelte:document>` and `<svelte:body>`
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: reuse the cached value in the `<option>`/`<select>` value guard
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: prevent malformed AST output for `<select>` with static `value` attribute
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: apply ownership mutation ignores to binding assignments
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: prevent onoutroend from firing twice when compilerOptions.hmr is true
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: preserve whitespace after inline elements when printing
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: fold SSR block-open markers into the branch's first push
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: run `onDestroy` callbacks when a server render throws
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: report `derived_invalid_export` for `export let x = $derived(...)` in runes mode
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: never apply class hash to elements inside `<svelte:head>`
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: keep `defaultChecked` on hydrated radio inputs with spread attributes
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: accept `onfocusin`/`onfocusout` in `a11y_mouse_events_have_key_events`
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: O(n²)→O(n) Map lookups for legacy `$:` reactive statement ordering
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: distinct memoizer on style/class directives
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: measure nested transitions before applying their starting styles
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: don't turn component instances stored in `$state` into state proxies
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': minor
|
||||
---
|
||||
|
||||
feat: export `RenderOutput`, `SyncRenderOutput`, `Csp` and `Sha256Source` from `svelte/server`
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: emit `$.only_child` for elements with a single child
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: more robust rendering of Svelte custom element slots
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
"svelte": patch
|
||||
---
|
||||
|
||||
perf: optimize simple object destructuring in `@const` tags
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: end a restored reaction context at the end of its synchronous segment
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: keep the dependencies of a reaction that throws, so deriveds it read are neither leaked nor stuck in their error
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: don't resurrect outroing elements when an ancestor block is paused and resumed
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: use `$.comment()` for single-comment templates
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: store setters cache as `Set` instead of `Array`
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: transform derived assignments and select function bindings correctly during server-side rendering
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: keep boolean attributes with an empty string value when rendering attribute objects on the server
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: sync `SvelteURL` port signal when the protocol setter clears the port
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': minor
|
||||
---
|
||||
|
||||
feat: support `defaultValue` on `<select>`
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: block declaration tags and `{@const}` on async values read inside closures
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: avoid css tree-shaking for exported Snippet
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
perf: treat `<img loading>` as a static element again
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: prevent `selectedcontent` mutation from changing the selected option
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: avoid `NaN` keyframe values in `slide` transition for elements without a layout box
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: preserve line feed character references in attribute values
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: decode uppercase-`X` hex numeric character references (`&#X...;`)
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
chore: clarify when `$effect.pre` runs relative to DOM updates
|
||||
@ -0,0 +1,5 @@
|
||||
---
|
||||
'svelte': patch
|
||||
---
|
||||
|
||||
fix: scope SSR boundary failed snippets to their boundary
|
||||
@ -1,229 +0,0 @@
|
||||
name: pkg.pr.new
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize]
|
||||
push:
|
||||
branches: [main]
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
sha:
|
||||
description: 'Commit SHA to build'
|
||||
required: true
|
||||
type: string
|
||||
pr:
|
||||
description: 'PR number to comment on'
|
||||
required: true
|
||||
type: number
|
||||
|
||||
permissions: {}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
# Skip pull_request_target events from forks — maintainers can use workflow_dispatch instead
|
||||
if: >
|
||||
github.event_name != 'pull_request_target' ||
|
||||
github.event.pull_request.head.repo.full_name == github.repository
|
||||
runs-on: ubuntu-latest
|
||||
# No permissions — this job runs user-controlled code
|
||||
permissions: {}
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
with:
|
||||
# For pull_request_target, check out the PR head.
|
||||
# For workflow_dispatch, check out the manually specified SHA.
|
||||
# For push, fall back to the push SHA.
|
||||
ref: ${{ github.event.pull_request.head.sha || inputs.sha || github.sha }}
|
||||
|
||||
- uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4
|
||||
- uses: actions/setup-node@v6
|
||||
with:
|
||||
node-version: 22.x
|
||||
cache: pnpm
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm install --frozen-lockfile
|
||||
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
|
||||
- run: pnpx pkg-pr-new publish --comment=off --json output.json --compact --no-template './packages/svelte'
|
||||
|
||||
- name: Upload output
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: output
|
||||
path: ./output.json
|
||||
|
||||
# Sanitizes the untrusted output from the build job before it's consumed by
|
||||
# jobs with elevated permissions. This ensures that only known package names
|
||||
# and valid SHA prefixes make it through.
|
||||
sanitize:
|
||||
needs: build
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions: {}
|
||||
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: output
|
||||
|
||||
- name: Sanitize output
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
const raw = JSON.parse(fs.readFileSync('output.json', 'utf8'));
|
||||
|
||||
const ALLOWED_PACKAGES = new Set(['svelte']);
|
||||
const SHA_PATTERN = /^[0-9a-f]{7}$/;
|
||||
|
||||
const packages = (raw.packages || [])
|
||||
.filter(p => {
|
||||
if (!ALLOWED_PACKAGES.has(p.name)) {
|
||||
console.log(`Skipping unexpected package: ${JSON.stringify(p.name)}`);
|
||||
return false;
|
||||
}
|
||||
const sha = p.url?.replace(/^.+@([^@]+)$/, '$1');
|
||||
if (!sha || !SHA_PATTERN.test(sha)) {
|
||||
console.log(`Skipping package with invalid SHA: ${JSON.stringify(p.url)}`);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
})
|
||||
.map(p => ({
|
||||
name: p.name,
|
||||
sha: p.url.replace(/^.+@([^@]+)$/, '$1'),
|
||||
}));
|
||||
|
||||
fs.writeFileSync('sanitized-output.json', JSON.stringify({ packages }), 'utf8');
|
||||
|
||||
- name: Upload sanitized output
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: sanitized-output
|
||||
path: ./sanitized-output.json
|
||||
|
||||
comment:
|
||||
needs: sanitize
|
||||
if: github.event_name == 'pull_request_target' || github.event_name == 'workflow_dispatch'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Download sanitized artifact
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: sanitized-output
|
||||
|
||||
- name: Resolve PR number
|
||||
id: pr
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
if (context.eventName === 'pull_request_target') {
|
||||
core.setOutput('number', context.issue.number);
|
||||
return;
|
||||
}
|
||||
|
||||
// For workflow_dispatch, use the explicitly provided PR number.
|
||||
// We can't use listPullRequestsAssociatedWithCommit because fork
|
||||
// commits don't exist in the base repo, so the API returns nothing.
|
||||
const pr = Number('${{ inputs.pr }}');
|
||||
if (!pr || isNaN(pr)) {
|
||||
core.setFailed('workflow_dispatch requires a valid pr input');
|
||||
return;
|
||||
}
|
||||
|
||||
core.setOutput('number', pr);
|
||||
|
||||
- name: Post or update comment
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
const { packages } = JSON.parse(fs.readFileSync('sanitized-output.json', 'utf8'));
|
||||
|
||||
if (packages.length === 0) {
|
||||
console.log('No valid packages found. Skipping comment.');
|
||||
return;
|
||||
}
|
||||
|
||||
const issue_number = parseInt('${{ steps.pr.outputs.number }}', 10);
|
||||
|
||||
const bot_comment_identifier = `<!-- pkg.pr.new comment -->`;
|
||||
|
||||
const body = `${bot_comment_identifier}
|
||||
|
||||
[Playground](https://svelte.dev/playground?version=pr-${issue_number})
|
||||
|
||||
\`\`\`
|
||||
${packages.map(p => `pnpm add https://pkg.pr.new/${p.name}@${issue_number}`).join('\n')}
|
||||
\`\`\`
|
||||
`;
|
||||
|
||||
const comments = await github.rest.issues.listComments({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number,
|
||||
});
|
||||
const existing = comments.data.find(c => c.body.includes(bot_comment_identifier));
|
||||
|
||||
if (existing) {
|
||||
await github.rest.issues.updateComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
comment_id: existing.id,
|
||||
body,
|
||||
});
|
||||
} else {
|
||||
await github.rest.issues.createComment({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
issue_number,
|
||||
body,
|
||||
});
|
||||
}
|
||||
|
||||
log:
|
||||
needs: sanitize
|
||||
if: github.event_name == 'push'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions: {}
|
||||
|
||||
steps:
|
||||
- name: Download sanitized artifact
|
||||
uses: actions/download-artifact@v7
|
||||
with:
|
||||
name: sanitized-output
|
||||
|
||||
- name: Log publish info
|
||||
uses: actions/github-script@v8
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
const { packages } = JSON.parse(fs.readFileSync('sanitized-output.json', 'utf8'));
|
||||
|
||||
if (packages.length === 0) {
|
||||
console.log('No valid packages found.');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log('\n' + '='.repeat(50));
|
||||
console.log('Publish Information');
|
||||
console.log('='.repeat(50));
|
||||
for (const p of packages) {
|
||||
console.log(`${p.name} - pnpm add https://pkg.pr.new/${p.name}@${p.sha}`);
|
||||
}
|
||||
const svelte = packages.find(p => p.name === 'svelte');
|
||||
if (svelte) {
|
||||
console.log(`\nPlayground: https://svelte.dev/playground?version=commit-${svelte.sha}`);
|
||||
}
|
||||
console.log('='.repeat(50));
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue