@ -27,9 +27,10 @@ const style_placeholder = '/*$$__STYLE_CONTENT__$$*/';
* May throw an error if the code is too complex to migrate automatically .
*
* @ param { string } source
* @ param { { filename ? : string } } [ options ]
* @ returns { { code : string ; } }
* /
export function migrate ( source ) {
export function migrate ( source , { filename } = { } ) {
try {
// Blank CSS, could contain SCSS or similar that needs a preprocessor.
// Since we don't care about CSS in this migration, we'll just ignore it.
@ -41,7 +42,7 @@ export function migrate(source) {
} ) ;
reset _warning _filter ( ( ) => false ) ;
reset ( source , { filename : 'migrate.svelte' } ) ;
reset ( source , { filename : filename ? ? 'migrate.svelte' } ) ;
let parsed = parse ( source ) ;
@ -68,6 +69,7 @@ export function migrate(source) {
let state = {
scope : analysis . instance . scope ,
analysis ,
filename ,
str ,
indent ,
props : [ ] ,
@ -90,12 +92,14 @@ export function migrate(source) {
createBubbler : analysis . root . unique ( 'createBubbler' ) . name ,
bubble : analysis . root . unique ( 'bubble' ) . name ,
passive : analysis . root . unique ( 'passive' ) . name ,
nonpassive : analysis . root . unique ( 'nonpassive' ) . name
nonpassive : analysis . root . unique ( 'nonpassive' ) . name ,
svelte _self : analysis . root . unique ( 'SvelteSelf' ) . name
} ,
legacy _imports : new Set ( ) ,
script _insertions : new Set ( ) ,
derived _components : new Map ( ) ,
derived _labeled _statements : new Set ( )
derived _labeled _statements : new Set ( ) ,
has _svelte _self : false
} ;
if ( parsed . module ) {
@ -122,12 +126,21 @@ export function migrate(source) {
state . script _insertions . size > 0 ||
state . props . length > 0 ||
analysis . uses _rest _props ||
analysis . uses _props ;
analysis . uses _props ||
state . has _svelte _self ;
if ( ! parsed . instance && need _script ) {
str . appendRight ( 0 , '<script>' ) ;
}
if ( state . has _svelte _self && filename ) {
const file = filename . split ( '/' ) . pop ( ) ;
str . appendRight (
insertion _point ,
` \n ${ indent } import ${ state . names . svelte _self } from './ ${ file } '; `
) ;
}
const specifiers = [ ... state . legacy _imports ] . map ( ( imported ) => {
const local = state . names [ imported ] ;
return imported === local ? imported : ` ${ imported } as ${ local } ` ;
@ -298,6 +311,7 @@ export function migrate(source) {
* scope : Scope ;
* str : MagicString ;
* analysis : ComponentAnalysis ;
* filename ? : string ;
* indent : string ;
* props : Array < { local : string ; exported : string ; init : string ; bindable : boolean ; slot _name ? : string ; optional : boolean ; type : string ; comment ? : string ; type _only ? : boolean ; needs _refine _type ? : boolean ; } > ;
* props _insertion _point : number ;
@ -306,8 +320,9 @@ export function migrate(source) {
* names : Record < string , string > ;
* legacy _imports : Set < string > ;
* script _insertions : Set < string > ;
* derived _components : Map < string , string > ,
* derived _labeled _statements : Set < LabeledStatement >
* derived _components : Map < string , string > ;
* derived _labeled _statements : Set < LabeledStatement > ;
* has _svelte _self : boolean ;
* } } State
* /
@ -729,9 +744,44 @@ const template = {
}
next ( ) ;
} ,
SvelteSelf ( node , { state , next } ) {
const source = state . str . original . substring ( node . start , node . end ) ;
if ( ! state . filename ) {
const indent = guess _indent ( source ) ;
state . str . prependRight (
node . start ,
` <!-- @migration-task: svelte:self is deprecated, import this Svelte file into itself instead --> \n ${ indent } `
) ;
next ( ) ;
return ;
}
// overwrite the open tag
state . str . overwrite (
node . start + 1 ,
node . start + 1 + 'svelte:self' . length ,
` ${ state . names . svelte _self } `
) ;
// if it has a fragment we need to overwrite the closing tag too
if ( node . fragment . nodes . length > 0 ) {
state . str . overwrite (
state . str . original . lastIndexOf ( '<' , node . end ) + 2 ,
node . end - 1 ,
` ${ state . names . svelte _self } `
) ;
} else if ( ! source . endsWith ( '/>' ) ) {
// special case for case `<svelte:self></svelte:self>` it has no fragment but
// we still need to overwrite the end tag
state . str . overwrite (
node . start + source . lastIndexOf ( '</' , node . end ) + 2 ,
node . end - 1 ,
` ${ state . names . svelte _self } `
) ;
}
state . has _svelte _self = true ;
next ( ) ;
} ,
SvelteElement ( node , { state , path , next } ) {
migrate _slot _usage ( node , path , state ) ;
if ( node . tag . type === 'Literal' ) {
let is _static = true ;