@ -7,12 +7,11 @@ import MagicString from 'magic-string';
import { walk } from 'zimmerframe' ;
import { walk } from 'zimmerframe' ;
import { parse } from '../phases/1-parse/index.js' ;
import { parse } from '../phases/1-parse/index.js' ;
import { analyze _component } from '../phases/2-analyze/index.js' ;
import { analyze _component } from '../phases/2-analyze/index.js' ;
import { validate _component _options } from '../validate-options.js' ;
import { get _rune } from '../phases/scope.js' ;
import { get _rune } from '../phases/scope.js' ;
import { reset , reset _warning _filter } from '../state.js' ;
import { reset , reset _warning _filter } from '../state.js' ;
import { extract _identifiers } from '../utils/ast.js' ;
import { extract _identifiers } from '../utils/ast.js' ;
import { regex _is _valid _identifier } from '../phases/patterns.js' ;
import { migrate _svelte _ignore } from '../utils/extract_svelte_ignore.js' ;
import { migrate _svelte _ignore } from '../utils/extract_svelte_ignore.js' ;
import { validate _component _options } from '../validate-options.js' ;
/ * *
/ * *
* Does a best - effort migration of Svelte code towards using runes , event attributes and render tags .
* Does a best - effort migration of Svelte code towards using runes , event attributes and render tags .
@ -63,7 +62,9 @@ export function migrate(source) {
self : analysis . root . unique ( 'self' ) . name ,
self : analysis . root . unique ( 'self' ) . name ,
trusted : analysis . root . unique ( 'trusted' ) . name ,
trusted : analysis . root . unique ( 'trusted' ) . name ,
createBubbler : analysis . root . unique ( 'createBubbler' ) . name ,
createBubbler : analysis . root . unique ( 'createBubbler' ) . name ,
bubble : analysis . root . unique ( 'bubble' ) . name
bubble : analysis . root . unique ( 'bubble' ) . name ,
passive : analysis . root . unique ( 'passive' ) . name ,
nonpassive : analysis . root . unique ( 'nonpassive' ) . name
} ,
} ,
legacy _imports : new Set ( ) ,
legacy _imports : new Set ( ) ,
script _insertions : new Set ( )
script _insertions : new Set ( )
@ -728,6 +729,7 @@ function handle_events(element, state) {
}
}
const handlers = [ ] ;
const handlers = [ ] ;
const explicit _passive _handlers = [ ] ;
for ( let i = 0 ; i < nodes . length ; i += 1 ) {
for ( let i = 0 ; i < nodes . length ; i += 1 ) {
const node = nodes [ i ] ;
const node = nodes [ i ] ;
@ -755,17 +757,36 @@ function handle_events(element, state) {
) ;
) ;
}
}
let has _passive = false ;
let has _nonpassive = false ;
for ( const modifier of sorted _modifier ) {
for ( const modifier of sorted _modifier ) {
has _passive || = modifier === 'passive' ;
has _nonpassive || = modifier === 'nonpassive' ;
if ( modifier !== 'capture' && modifier !== 'passive' && modifier !== 'nonpassive' ) {
if ( modifier !== 'capture' && modifier !== 'passive' && modifier !== 'nonpassive' ) {
state . legacy _imports . add ( modifier ) ;
state . legacy _imports . add ( modifier ) ;
body = ` ${ state . legacy _imports _names [ modifier ] } ( ${ body } ) ` ;
body = ` ${ state . legacy _imports _names [ modifier ] } ( ${ body } ) ` ;
}
}
}
}
handlers . push ( {
if ( has _passive || has _nonpassive ) {
handler : body ,
if ( has _passive ) {
indent ,
state . legacy _imports . add ( 'passive' ) ;
needs _line _delete
}
} ) ;
if ( has _nonpassive ) {
state . legacy _imports . add ( 'nonpassive' ) ;
}
explicit _passive _handlers . push ( {
handler : ` use: ${ has _nonpassive ? state . legacy _imports _names . nonpassive : state . legacy _imports _names . passive } ={{ handler: () => ${ body } , event: ' ${ node . name } ' }} ` ,
indent ,
needs _line _delete
} ) ;
} else {
handlers . push ( {
handler : body ,
indent ,
needs _line _delete
} ) ;
}
state . str . remove ( needs _line _delete ? new _line _index : node . start , node . end ) ;
state . str . remove ( needs _line _delete ? new _line _index : node . start , node . end ) ;
}
}
@ -773,17 +794,25 @@ function handle_events(element, state) {
if ( first _node ) {
if ( first _node ) {
let handlers _body = '' ;
let handlers _body = '' ;
for ( le t handler of handlers ) {
for ( cons t handler of handlers ) {
handlers _body += ` ${ handler . needs _line _delete || nodes . length > 1 ? ` \n ${ handler . indent } ` : '' } ${ handler . handler } , ` ;
handlers _body += ` ${ handler . needs _line _delete || nodes . length > 1 ? ` \n ${ handler . indent } ` : '' } ${ handler . handler } , ` ;
}
}
handlers _body = handlers _body . substring ( 0 , handlers _body . length - 1 ) ;
handlers _body = handlers _body . substring ( 0 , handlers _body . length - 1 ) ;
if ( handlers _body === name ) {
if ( handlers _body ) {
state . str . overwrite ( first _node . start , first _node . end , ` { ${ name } } ` ) ;
if ( handlers _body === name ) {
} else {
state . str . overwrite ( first _node . start , first _node . end , ` { ${ name } } ` ) ;
state . str . overwrite (
} else {
first _node . start ,
state . str . overwrite (
first _node . start ,
first _node . end ,
` ${ name } ={ ${ nodes . length > 1 ? ` ${ state . legacy _imports _names . handlers } ( ` : '' } ${ handlers _body } ${ nodes . length > 1 ? ')' : '' } } `
) ;
}
}
for ( const passive _handler of explicit _passive _handlers ) {
state . str . appendRight (
first _node . end ,
first _node . end ,
` ${ name } ={ ${ nodes . length > 1 ? ` ${ state . legacy _imports _names . handlers } ( ` : '' } ${ handlers _body } ${ nodes . length > 1 ? ')' : '' } } `
` ${ passive_handler . needs _line _delete || nodes . length > 1 ? ` \n ${ passive _handler . indent } ` : '' } ${ passive _handler . handler }`
) ;
) ;
}
}
}
}