sveast 0.9.4 → 0.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/core.js +1 -1
- package/entities.js +1 -1
- package/index.d.ts +3 -1
- package/index.js +1 -1
- package/is-valid-type.js +1 -1
- package/lexer.js +3 -3
- package/module.js +1 -1
- package/package.json +1 -1
- package/parse-imports-exports.js +1 -1
- package/parse-module.js +1 -1
- package/parse-sections.js +1 -1
- package/parse.js +1 -1
- package/runes.js +1 -1
- package/scope.d.ts +3 -1
- package/scope.js +1 -1
- package/shared-2pngd0mg.js +10 -0
- package/shared-5tpb3h6x.js +2 -0
- package/shared-bzqbnvee.js +2 -0
- package/shared-cs1ezg1f.js +2 -0
- package/shared-dgdrqgdn.js +2 -0
- package/shared-drb44hb9.js +2 -0
- package/shared-h6z1kjbb.js +2 -0
- package/shared-jpvd0875.js +2 -0
- package/shared-ke0fgd3r.js +2 -0
- package/shared-m0dcdh24.js +5 -0
- package/shared-m3dr31c3.js +2 -0
- package/shared-nan648gn.js +10 -0
- package/shared-qkp49nav.js +2 -0
- package/shared-rce4ty8a.js +3 -0
- package/shared-rvkvagj5.js +2 -0
- package/shared-xwzsb4m8.js +3 -0
- package/shared-y3nf00py.js +3 -0
- package/shared-y41kz9tv.js +2 -0
- package/shared-z9y4mrek.js +2 -0
- package/typescript.js +1 -1
- package/walk.js +1 -1
- package/shared-2by923ar.js +0 -3
- package/shared-3371ehgf.js +0 -2
- package/shared-4wqe6a27.js +0 -5
- package/shared-4zk9ntab.js +0 -2
- package/shared-artd3d80.js +0 -2
- package/shared-c9gzmr05.js +0 -2
- package/shared-h6c4cer7.js +0 -2
- package/shared-hjcsmz9f.js +0 -2
- package/shared-jxkrk6hx.js +0 -10
- package/shared-n0fpkmn8.js +0 -2
- package/shared-n1wnwhk8.js +0 -3
- package/shared-nbaaegmc.js +0 -2
- package/shared-rh41v5ez.js +0 -3
- package/shared-shxvsq2a.js +0 -2
- package/shared-stdj6se1.js +0 -2
- package/shared-v0nj05q2.js +0 -2
- package/shared-vjpq32kx.js +0 -2
- package/shared-xyqvjc3m.js +0 -10
- package/shared-znzncsf2.js +0 -2
package/README.md
CHANGED
|
@@ -385,7 +385,7 @@ size?.references.some((reference) => reference.writes || reference.mutates); //
|
|
|
385
385
|
It returns:
|
|
386
386
|
|
|
387
387
|
- **`module`** and **`instance`**, the scopes of `<script module>` and `<script>` (one scope, for a module). A `Scope` has the `node` that makes it, its `parent`, its `declarations` by name, and `get(name)`, the binding a name refers to there, or `null` for a global.
|
|
388
|
-
- **`scopeOf(node)`**, the scope a node is in; `null` in a type, the `<style>` or another AST.
|
|
388
|
+
- **`scopeOf(node)`**, the scope a node is in; `null` in a type, the `<style>` or another AST. The first call walks the AST again to record every node's scope, so a tool that only resolves names doesn't keep a map of every node.
|
|
389
389
|
- **`bindingOf(identifier)`**, the binding an `Identifier` declares or refers to; `null` for a global, a property key or a name in a type.
|
|
390
390
|
- **`referenceOf(identifier)`**, the `Reference` an `Identifier` is, to tell a read from a write or a store subscription; `null` for one that declares a binding or isn't a reference.
|
|
391
391
|
- **`declaredIn(node)`**, the bindings of the scope a node makes: a function's parameters (its body's declarations are its body's), a block's or an each block's declarations, a snippet's parameters, or an element's `let:` names.
|
package/core.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./shared-
|
|
1
|
+
import"./shared-dgdrqgdn.js";import"./shared-m0dcdh24.js";import"./shared-2pngd0mg.js";import{ParseError2}from"./shared-nan648gn.js";import"./shared-5tpb3h6x.js";import{xmlEntityNames}from"./shared-bzqbnvee.js";import{parseComponent}from"./shared-xwzsb4m8.js";import"./shared-y3nf00py.js";import{parseModuleWith}from"./shared-z9y4mrek.js";import{parseImportsExportsWith}from"./shared-rvkvagj5.js";import{typeScriptParser,entityNamesOf}from"./shared-h6z1kjbb.js";function createParser(support={}){let typescript=typeScriptParser(support.typescript),internal={typescript,entityNames:entityNamesOf(support.entities)??xmlEntityNames};return{parse:(source,options)=>parseComponent(source,options,internal),parseModule:(source,options={})=>parseModuleWith(source,options,typescript),parseImportsExports:(source,options={})=>parseImportsExportsWith(source,options,typescript)}}export{ParseError2 as ParseError,createParser};
|
package/entities.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./shared-
|
|
1
|
+
import"./shared-bzqbnvee.js";import{htmlEntityNames}from"./shared-drb44hb9.js";import{entitySupport}from"./shared-h6z1kjbb.js";var entities=entitySupport(htmlEntityNames);export{entities};
|
package/index.d.ts
CHANGED
|
@@ -2147,7 +2147,9 @@ export interface Scopes {
|
|
|
2147
2147
|
/**
|
|
2148
2148
|
* The scope `node` is in: for a function, the scope around it, while
|
|
2149
2149
|
* its parameters are in its own. `null` for a node in a type, in the
|
|
2150
|
-
* `<style>` or outside the AST.
|
|
2150
|
+
* `<style>` or outside the AST. The first call walks the AST again to
|
|
2151
|
+
* record every node's scope, which the rest of the analysis doesn't
|
|
2152
|
+
* need.
|
|
2151
2153
|
*/
|
|
2152
2154
|
scopeOf(node: AST.SvelteNode): Scope | null;
|
|
2153
2155
|
/**
|
package/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isValidType
|
|
1
|
+
import{isValidType}from"./is-valid-type.js";import{lexComponent,lexImportsExports,lexStrings}from"./lexer.js";import{parse}from"./parse.js";import{parseImportsExports}from"./parse-imports-exports.js";import{ParseError,parseModule}from"./parse-module.js";import{parseSections}from"./parse-sections.js";import{isRunesMode}from"./runes.js";import{analyzeScopes}from"./scope.js";import{children,createLocator,extractIdentifiers,forEachChild,isReference,locate,markupVisitorKeys,SKIP,STOP,skipTypeWrappers,valueVisitorKeys,visitorKeys,walk}from"./walk.js";export{ParseError,SKIP,STOP,analyzeScopes,children,createLocator,extractIdentifiers,forEachChild,isReference,isRunesMode,isValidType,lexComponent,lexImportsExports,lexStrings,locate,markupVisitorKeys,parse,parseImportsExports,parseModule,parseSections,skipTypeWrappers,valueVisitorKeys,visitorKeys,walk};
|
package/is-valid-type.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Parser}from"./shared-2pngd0mg.js";import{tsPlugin}from"./shared-cs1ezg1f.js";var RESERVED_WORDS=new Set("abstract accessor arguments as asserts async await break case catch class const continue debugger declare default delete do else enum eval export extends false finally for function get global if implements import in infer instanceof interface intrinsic is keyof let module namespace new null of out override package private protected public readonly return satisfies set static super switch this throw true try type typeof unique var void while with yield".split(" ")),STANDALONE_WORDS=new Set("any bigint boolean false never null number object string symbol true undefined unknown void".split(" ")),MODIFIER_KEYS=new Set("get set new readonly static public private protected".split(" "));function isWordStart(code){return code>=97&&code<=122||code>=65&&code<=90||code===95||code===36}function isDigit(code){return code>=48&&code<=57}function isWordPart(code){return isWordStart(code)||isDigit(code)}class CommonTypeReader{text;pos=0;constructor(text){this.text=text}readAll(){if(!this.type())return!1;return this.peek(),this.pos===this.text.length}peek(){let text=this.text,pos=this.pos,code=text.charCodeAt(pos);while(code===32||code===9)code=text.charCodeAt(++pos);return this.pos=pos,code}eat(char){if(this.peek()!==char.charCodeAt(0))return!1;return this.pos++,!0}word(){let start=this.pos;return this.skipWord()?this.text.slice(start,this.pos):void 0}skipWord(){if(!isWordStart(this.peek()))return!1;let end=this.pos+1;while(isWordPart(this.text.charCodeAt(end)))end++;return this.pos=end,!0}keyword(word){this.peek();let end=this.pos+word.length;if(!this.text.startsWith(word,this.pos)||isWordPart(this.text.charCodeAt(end)))return!1;return this.pos=end,!0}name(){let word=this.word();return word!==void 0&&!RESERVED_WORDS.has(word)}string(){let quote=this.peek();if(quote!==34&"e!==39)return!1;let text=this.text;for(let i=this.pos+1;i<text.length;i++){let code=text.charCodeAt(i);if(code===quote)return this.pos=i+1,!0;if(code===92||code===10||code===13||code===8232||code===8233)return!1}return!1}number(){let text=this.text,i=this.pos;if(text.charCodeAt(i)===45)i++;let digits=i;while(isDigit(text.charCodeAt(i)))i++;if(i===digits||i-digits>1&&text.charCodeAt(digits)===48)return!1;if(text.charCodeAt(i)===46){let fraction=++i;while(isDigit(text.charCodeAt(i)))i++;if(i===fraction)return!1}let next=text.charCodeAt(i);if(isWordPart(next)||next===46)return!1;return this.pos=i,!0}type(){if(this.peek()===40){let start=this.pos;if(this.functionType())return!0;this.pos=start}do do if(!this.operatorType())return!1;while(this.eat("&"));while(this.eat("|"));return!0}operatorType(){if(this.keyword("keyof"))return this.operatorType();if(!this.primaryType())return!1;while(this.eat("[")){if(this.eat("]"))continue;if(!this.type()||!this.eat("]"))return!1}return!0}primaryType(){let code=this.peek();if(code===40)return this.pos++,this.type()&&this.eat(")");if(code===123)return this.objectType();if(code===91)return this.tupleType();if(code===34||code===39)return this.string();if(code===45||isDigit(code))return this.number();let word=this.word();if(word===void 0)return!1;if(word==="typeof")return this.typeQuery();if(word==="import")return this.importType(!0);if(STANDALONE_WORDS.has(word)){let next=this.peek();return next!==46&&next!==60}if(RESERVED_WORDS.has(word))return!1;while(this.eat("."))if(!this.skipWord())return!1;return!this.eat("<")||this.typeArguments()}typeArguments(){do if(!this.type())return!1;while(this.eat(","));return this.eat(">")}typeQuery(){if(this.keyword("import"))return this.importType(!1);do if(!this.name())return!1;while(this.eat("."));return!0}importType(allowTypeArguments){if(!this.eat("(")||!this.string()||!this.eat(")"))return!1;while(this.eat("."))if(!this.name())return!1;return!allowTypeArguments||!this.eat("<")||this.typeArguments()}objectType(){this.pos++;while(!this.eat("}")){if(!this.typeMember())return!1;if(!this.eat(";")&&!this.eat(",")&&this.peek()!==125)return!1}return!0}typeMember(){let code=this.peek();if(this.eat("[")){let next=this.peek();if(next===34||next===39){if(!this.string()||!this.eat("]"))return!1}else return this.name()&&this.eat(":")&&this.type()&&this.eat("]")&&this.eat(":")&&this.type()}else if(code===34||code===39){if(!this.string())return!1}else{let key=this.word();if(key===void 0||MODIFIER_KEYS.has(key))return!1}return this.eat("?"),this.eat(":")&&this.type()}tupleType(){if(this.pos++,this.eat("]"))return!0;do if(!this.type())return!1;while(this.eat(","));return this.eat("]")}functionType(){if(this.pos++,!this.eat(")")){let names=new Set;for(;;){this.peek();let rest=this.text.startsWith("...",this.pos);if(rest)this.pos+=3;let name=this.word();if(name===void 0||RESERVED_WORDS.has(name)||names.has(name))return!1;if(names.add(name),!rest)this.eat("?");if(!this.eat(":")||!this.type())return!1;if(rest||!this.eat(","))break}if(!this.eat(")"))return!1}if(this.peek(),!this.text.startsWith("=>",this.pos))return!1;return this.pos+=2,this.type()}}function isCommonType(text){return new CommonTypeReader(text).readAll()}var TypeParser=Parser.extend(tsPlugin);function isValidType(text,options={}){return isCommonType(text)||parsesAsType(text,options.inline??!1)}function parsesAsType(text,inline){let lineCommentAtEnd=!1,parser=new TypeParser(inline?{ecmaVersion:16,sourceType:"module",onComment:(block,_text,_start,end)=>{if(!block&&end===text.length)lineCommentAtEnd=!0}}:{ecmaVersion:16,sourceType:"module"},text);try{return parser.parseWholeType(),!lineCommentAtEnd}catch(error){if(error instanceof SyntaxError)return!1;throw error}}export{isValidType,parsesAsType};
|
package/lexer.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{
|
|
2
|
-
`,
|
|
3
|
-
`;case 114:return"\r";case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 48:return
|
|
1
|
+
import{isDigit}from"./shared-5tpb3h6x.js";import{isWordCode,scan,scanLiterals,lineEnd,skipTrivia,isWordAt}from"./shared-y3nf00py.js";import"./shared-dgdrqgdn.js";import{lexComponent2}from"./shared-rce4ty8a.js";function lexImportsExports(source){let lexer=new Lexer(source),statements=[];return scan(source,!1,(_start,keyword)=>{let statement=lexer.statement(keyword);return statements.push(statement),statement.end}),statements}function lexStrings(source){let lexer=new Lexer(source),strings=[];return scanLiterals(source,(start,end,template)=>{let quote=template?0:1;strings.push({kind:template?"template":"string",value:lexer.cooked(start+quote,end-quote,template),start,end})}),strings}class Lexer{source;pos=0;end=0;escapeEnd=0;constructor(source){this.source=source}statement(keyword){this.pos=this.end=keyword+6;let statement={kind:this.source.charCodeAt(keyword)===105?"import":"export",start:keyword,end:0,source:null,typeOnly:!1,specifiers:[]};if(!(statement.kind==="import"?this.import(statement):this.export(statement)))statement.source=null,statement.specifiers=[];return statement.end=this.end,statement}import(statement){let module=this.string();if(module!==null)return statement.source=module,this.finish();if(this.isWord("type")){let next=this.peekAfter(4);if(next===123||next===42||isIdentifierStart(next)&&!this.isWordAfter(4,"from"))statement.typeOnly=!0,this.advance(4)}let{specifiers,typeOnly}=statement,next=this.at();if(next!==123&&next!==42){let start=this.pos,local=this.name();if(local===null)return!1;if(this.at()===61)return this.importEquals();if(specifiers.push({kind:"default",imported:"default",local,typeOnly,start,end:this.end}),!this.eat(44))return this.from(statement);next=this.at()}if(next===42){let start=this.pos;if(this.advance(1),!this.eatWord("as"))return!1;let local=this.name();if(local===null)return!1;return specifiers.push({kind:"namespace",imported:"*",local,typeOnly,start,end:this.end}),this.from(statement)}if(!this.eat(123))return!1;while(!this.eat(125)){let start=this.skip(),named=this.typeModifier()||typeOnly,name=this.name(),imported=name??this.string()?.value;if(imported===void 0)return!1;let local=name;if(this.eatWord("as"))local=this.name();if(local===null)return!1;if(specifiers.push({kind:"named",imported,local,typeOnly:named,start,end:this.end}),!this.eat(44)&&this.at()!==125)return!1}return this.from(statement)}export(statement){if(this.eatWord("import")){if(this.isWord("type")&&isIdentifierStart(this.peekAfter(4))&&!this.isWordAfter(4,"from"))statement.typeOnly=!0,this.advance(4);return this.name()!==null&&this.at()===61&&this.importEquals()}if(this.isWord("type")){let next=this.peekAfter(4);if(next===123||next===42)statement.typeOnly=!0,this.advance(4)}let{specifiers,typeOnly}=statement;if(this.at()===42){let start=this.pos;this.advance(1);let exported=null;if(this.eatWord("as")){if(exported=this.moduleExportName(),exported===null)return!1}return specifiers.push({kind:exported===null?"all":"namespace",local:"*",exported,typeOnly,start,end:this.end}),this.from(statement)}if(!this.eat(123))return!1;while(!this.eat(125)){let start=this.skip(),named=this.typeModifier()||typeOnly,local=this.moduleExportName();if(local===null)return!1;let exported=local;if(this.eatWord("as"))exported=this.moduleExportName();if(exported===null)return!1;if(specifiers.push({kind:"named",local,exported,typeOnly:named,start,end:this.end}),!this.eat(44)&&this.at()!==125)return!1}return this.from(statement)}typeModifier(){if(!this.isWord("type"))return!1;let next=this.peekAfter(4);if(next===34||next===39||isIdentifierStart(next)&&!this.isWordAfter(4,"as"))return this.advance(4),!0;return!1}importEquals(){if(this.advance(1),this.isWord("require")&&this.peekAfter(7)===40){if(this.advance(7),this.eat(40),this.string()===null||!this.eat(41))return!1}else do if(this.name()===null)return!1;while(this.eat(46));return this.eat(59),!0}from(statement){if(!this.eatWord("from"))return!1;return statement.source=this.string(),statement.source!==null&&this.finish()}finish(){let keyword=this.isWord("with")?4:0;if(this.isWord("assert")&&lineEnd(this.source,this.end)>=this.pos)keyword=6;if(keyword!==0&&this.peekAfter(keyword)===123){this.advance(keyword),this.eat(123);while(!this.eat(125))if(this.string()===null&&this.name()===null&&!this.eat(58)&&!this.eat(44))return!1}return this.eat(59),!0}skip(){return this.pos=skipTrivia(this.source,this.pos),this.pos}at(){return this.source.charCodeAt(this.skip())}advance(length){this.pos+=length,this.end=this.pos}peekAfter(length){return this.source.charCodeAt(skipTrivia(this.source,this.pos+length))}isWordAfter(length,word){return isWordAt(this.source,skipTrivia(this.source,this.pos+length),word)}eat(code){if(this.at()!==code)return!1;return this.advance(1),!0}isWord(word){return isWordAt(this.source,this.skip(),word)}eatWord(word){if(!this.isWord(word))return!1;return this.advance(word.length),!0}moduleExportName(){return this.name()??this.string()?.value??null}name(){let source=this.source,start=this.skip();if(!isWordCode(source.charCodeAt(start))||isDigit(source.charCodeAt(start)))return null;let value="",chunk=start,i=start;while(i<source.length){let code=source.charCodeAt(i);if(code===92){if(source.charCodeAt(i+1)!==117)return null;let escaped=this.unicodeEscape(i+2);if(escaped===null)return null;value+=source.slice(chunk,i)+escaped,i=chunk=this.escapeEnd}else if(isWordCode(code))i++;else break}return this.advance(i-start),value+source.slice(chunk,i)}string(){let source=this.source,start=this.skip(),quote=source.charCodeAt(start);if(quote!==34&"e!==39)return null;let value="",chunk=start+1;for(let i=chunk;i<source.length;){let code=source.charCodeAt(i);if(code===quote)return this.advance(i+1-start),{value:value+source.slice(chunk,i),start,end:i+1};if(code===10||code===13)return null;if(code===92){let escaped=this.escape(i+1);if(escaped===null)return null;value+=source.slice(chunk,i)+escaped,i=chunk=this.escapeEnd}else i++}return null}cooked(from,to,template){let source=this.source,value="",chunk=from;for(let i=from;i<to;){let code=source.charCodeAt(i);if(code===92){let escaped=this.escape(i+1);if(escaped===null)return null;value+=source.slice(chunk,i)+escaped,i=chunk=this.escapeEnd}else if(code===13&&template)value+=`${source.slice(chunk,i)}
|
|
2
|
+
`,i+=source.charCodeAt(i+1)===10?2:1,chunk=i;else i++}return value+source.slice(chunk,to)}escape(pos){let code=this.source.charCodeAt(pos);switch(this.escapeEnd=pos+1,code){case 110:return`
|
|
3
|
+
`;case 114:return"\r";case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 48:return isDigit(this.source.charCodeAt(pos+1))?null:"\x00";case 120:return this.hexEscape(pos+1,2);case 117:return this.unicodeEscape(pos+1);case 13:if(this.source.charCodeAt(pos+1)===10)this.escapeEnd++;return"";case 10:case 8232:case 8233:return"";default:return isDigit(code)||pos>=this.source.length?null:String.fromCharCode(code)}}unicodeEscape(pos){if(this.source.charCodeAt(pos)!==123)return this.hexEscape(pos,4);let value=0,i=pos+1;for(;this.source.charCodeAt(i)!==125;i++){let digit=hexValue(this.source.charCodeAt(i));if(digit===-1)return null;if(value=value*16+digit,value>1114111)return null}if(i===pos+1)return null;return this.escapeEnd=i+1,String.fromCodePoint(value)}hexEscape(pos,length){let value=0;for(let i=pos;i<pos+length;i++){let digit=hexValue(this.source.charCodeAt(i));if(digit===-1)return null;value=value*16+digit}return this.escapeEnd=pos+length,String.fromCharCode(value)}}function isIdentifierStart(code){return code!==92&&isWordCode(code)&&!isDigit(code)}function hexValue(code){if(isDigit(code))return code-48;let lower=code|32;return lower>=97&&lower<=102?lower-87:-1}export{lexComponent2 as lexComponent,lexImportsExports,lexStrings};
|
package/module.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./shared-
|
|
1
|
+
import"./shared-2pngd0mg.js";import"./shared-m0dcdh24.js";import{ParseError2}from"./shared-nan648gn.js";import"./shared-5tpb3h6x.js";import"./shared-y3nf00py.js";import{parseModuleWith}from"./shared-z9y4mrek.js";import{parseImportsExportsWith}from"./shared-rvkvagj5.js";import{typeScriptParser}from"./shared-h6z1kjbb.js";function createModuleParser(support={}){let typescript=typeScriptParser(support.typescript);return{parseModule:(source,options={})=>parseModuleWith(source,options,typescript),parseImportsExports:(source,options={})=>parseImportsExportsWith(source,options,typescript)}}export{ParseError2 as ParseError,createModuleParser};
|
package/package.json
CHANGED
package/parse-imports-exports.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./shared-
|
|
1
|
+
import"./shared-2pngd0mg.js";import"./shared-m0dcdh24.js";import"./shared-nan648gn.js";import"./shared-5tpb3h6x.js";import"./shared-y3nf00py.js";import"./shared-cs1ezg1f.js";import{TypeScriptParser}from"./shared-ke0fgd3r.js";import{parseImportsExportsWith}from"./shared-rvkvagj5.js";function parseImportsExports(source,options={}){return parseImportsExportsWith(source,options,TypeScriptParser)}export{parseImportsExports};
|
package/parse-module.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./shared-
|
|
1
|
+
import"./shared-2pngd0mg.js";import"./shared-m0dcdh24.js";import{ParseError2}from"./shared-nan648gn.js";import"./shared-cs1ezg1f.js";import{TypeScriptParser}from"./shared-ke0fgd3r.js";import{parseModuleWith}from"./shared-z9y4mrek.js";function parseModule(source,options={}){return parseModuleWith(source,options,TypeScriptParser)}export{ParseError2 as ParseError,parseModule};
|
package/parse-sections.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{parseSections2}from"./shared-y41kz9tv.js";import"./shared-rce4ty8a.js";import"./shared-drb44hb9.js";import"./shared-ke0fgd3r.js";import"./shared-cs1ezg1f.js";import"./shared-xwzsb4m8.js";import"./shared-bzqbnvee.js";import"./shared-dgdrqgdn.js";import"./shared-y3nf00py.js";import"./shared-5tpb3h6x.js";import"./shared-nan648gn.js";import"./shared-m0dcdh24.js";import"./shared-2pngd0mg.js";export{parseSections2 as parseSections};
|
package/parse.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{parse2}from"./shared-qkp49nav.js";import"./shared-drb44hb9.js";import"./shared-ke0fgd3r.js";import"./shared-cs1ezg1f.js";import"./shared-xwzsb4m8.js";import"./shared-bzqbnvee.js";import"./shared-dgdrqgdn.js";import"./shared-5tpb3h6x.js";import"./shared-nan648gn.js";import"./shared-m0dcdh24.js";import"./shared-2pngd0mg.js";export{parse2 as parse};
|
package/runes.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./shared-
|
|
1
|
+
import"./shared-dgdrqgdn.js";import{withoutByteOrderMark,isWhitespace,skipWhitespace}from"./shared-5tpb3h6x.js";import{isWordCode,closingBracket,wordCodesEnd}from"./shared-y3nf00py.js";import"./shared-m0dcdh24.js";import"./shared-2pngd0mg.js";import"./shared-nan648gn.js";import"./shared-bzqbnvee.js";import"./shared-xwzsb4m8.js";import"./shared-cs1ezg1f.js";import{parse2}from"./shared-qkp49nav.js";import{parseSections2}from"./shared-y41kz9tv.js";import{extractIdentifiers2,isReference2,STOP2,SKIP2,walk2}from"./shared-jpvd0875.js";import{RUNES,RUNE_NAMES}from"./shared-m3dr31c3.js";import{lexComponent2}from"./shared-rce4ty8a.js";import"./shared-drb44hb9.js";import"./shared-ke0fgd3r.js";var REGEX_CANDIDATE=/(?<![\w$])(?:\$(?:state|derived|props|bindable|effect|inspect|host)(?![\w$])|await(?![\w$]))|\\u/g,BOOLEAN_EXPRESSION=/^\{\s*(true|false)\s*\}$/;function isRunesMode(source){let lexed=lexComponent2(source),option=lexed.options?.attributes.find((attribute)=>attribute.name==="runes"),fromOption=option&&booleanValue(option);if(fromOption!==void 0)return fromOption;let text=withoutByteOrderMark(source),scripts=[lexed.instance,lexed.module].flatMap((script)=>script?[script.content]:[]),candidates=!1,inMarkup=!1,onlyAwait=!0;REGEX_CANDIDATE.lastIndex=0;for(let match=REGEX_CANDIDATE.exec(text);match!==null&&!(inMarkup&&!onlyAwait);match=REGEX_CANDIDATE.exec(text)){let at=match.index;candidates=!0,onlyAwait&&=match[0]==="await",inMarkup||=!scripts.some(({start,end})=>at>=start&&at<end)}if(!candidates)return!1;if(!onlyAwait&&option===void 0&&!text.includes("\\u")&&callsRune(text,scripts))return!0;let options={css:!1,comments:!1},ast=inMarkup?parse2(source,options):parseSections2(source,options);if(ast.options?.runes!==void 0)return ast.options.runes;if(onlyAwait)return ast.instance!==void 0&&awaitsOutsideFunctions(ast.instance.content)||awaitsOutsideFunctions(ast.fragment);return usesRunes(ast)}function awaitsOutsideFunctions(root){let awaits=!1;return walk2(root,{enter(node){if(isFunction(node))return SKIP2;if(node.type!=="AwaitExpression")return;return awaits=!0,STOP2}}),awaits}function booleanValue(attribute){if(attribute.value===!0)return!0;let match=BOOLEAN_EXPRESSION.exec(attribute.value);return match?match[1]==="true":void 0}var STORE_NAMES=new Map([...RUNE_NAMES].map((name)=>[name,new RegExp(`(?<![\\w$.])${name.slice(1)}(?![\\w$])`)])),DECLARING_WORDS=new Set("abstract accessor as async class const declare enum export extends function get implements import infer interface is keyof let module namespace new override private protected public readonly satisfies set static type typeof unique var".split(" "));function callsRune(source,scripts){let calls=new Map;for(let{start,end}of scripts){let script=source.slice(0,end);if(closingBracket(script,start,(wordStart,wordEnd)=>{if(script.charCodeAt(wordStart)!==36)return!1;let name=script.slice(wordStart,wordEnd);if(RUNE_NAMES.has(name)&&calls.get(name)!==!1)calls.set(name,isRuneCall(script,wordStart,wordEnd));return!1})!==script.length)return!1}for(let[name,call]of calls)if(call&&!STORE_NAMES.get(name)?.test(source))return!0;return!1}function isRuneCall(source,start,end){let before=start-1;while(before>=0&&isWhitespace(source.charCodeAt(before)))before--;let previous=source.charCodeAt(before);if(previous===35||previous===42||previous===46||previous===58||previous===60||previous===64)return!1;if(isWordCode(previous)){let wordStart=before;while(wordStart>0&&isWordCode(source.charCodeAt(wordStart-1)))wordStart--;if(DECLARING_WORDS.has(source.slice(wordStart,before+1)))return!1}let i=skipWhitespace(source,end);while(source.charCodeAt(i)===46){let wordStart=skipWhitespace(source,i+1),wordEnd=wordCodesEnd(source,wordStart);if(wordEnd===wordStart)return!1;i=skipWhitespace(source,wordEnd)}if(source.charCodeAt(i)===60){if(i=typeArgumentsEnd(source,i),i===-1)return!1;i=skipWhitespace(source,i)}if(source.charCodeAt(i)!==40)return!1;let close=closingBracket(source,i+1);if(source.charCodeAt(close)!==41)return!1;let next=source.charCodeAt(skipWhitespace(source,close+1));return next!==123&&next!==58}function typeArgumentsEnd(source,from){let depth=0,limit=Math.min(source.length,from+2000);for(let i=from;i<limit;i++){let code=source.charCodeAt(i);if(code===34||code===39||code===96||code===47)return-1;if(code===60)depth++;else if(code===62&&source.charCodeAt(i-1)!==61){if(depth--,depth===0)return i+1}}return-1}function usesRunes(ast){let module=ast.module?.content,instance=ast.instance?.content,declared=new Map;if(instance)declare(instance,declared,!0);let moduleDeclared=new Map;if(module)declare(module,moduleDeclared,!1);for(let[name,initial]of moduleDeclared)if(!declared.has(name))declared.set(name,initial);let referenced=[],reference=(name)=>{if(!referenced.includes(name))referenced.push(name)};if(module)collectReferences(module,moduleDeclared,reference);if(instance&&collectReferences(instance,declared,reference))return!0;if(collectReferences(ast.fragment,declared,reference))return!0;for(let name of referenced){let store=name.slice(1);if(!declared.has(store))return!0;let initial=declared.get(store)??null,rune=runeOf(initial,declared);if(!((rune===null||store!=="props"&&rune==="$props")&&!(name==="$derived"&&initial?.type==="ImportDeclaration"&&initial.source.value==="svelte/store")))return!0;declared.set(name,null)}return!1}function collectReferences(root,outer,reference){let ancestors=[],scopes=new Map,unresolved=(name)=>RUNE_NAMES.has(name)&&!outer.has(name)&&!ancestors.some((ancestor)=>declaredIn(ancestor,scopes).has(name)),functions=0,awaits=!1;return walk2(root,{enter(node,parent){if(isFunction(node))functions++;else if(node.type==="AwaitExpression")awaits||=functions===0;let name;if(node.type==="Identifier"&&parent&&!parent.type.startsWith("TS")&&isReference2(node,parent))name=node.name;else if(node.type==="TransitionDirective"||node.type==="AnimateDirective"||node.type==="UseDirective")name=node.name.split(".")[0];else if(node.type==="StyleDirective"&&node.value===!0)name=node.name;if(name!==void 0&&unresolved(name))reference(name);ancestors.push(node)},leave(node){if(ancestors.pop(),isFunction(node))functions--}}),awaits}var NO_NAMES=new Set;function declaredIn(node,scopes){let cached=scopes.get(node);if(cached)return cached;let patterns=[];if(isFunction(node)){if(patterns.push(...node.params),node.type==="FunctionExpression"&&node.id)patterns.push(node.id)}else if(node.type==="CatchClause"&&node.param)patterns.push(node.param);else if(node.type==="SnippetBlock")patterns.push(...node.parameters??[]);else if(node.type==="EachBlock"&&node.context)patterns.push(node.context);if(patterns.length===0&&!isFunction(node))return scopes.set(node,NO_NAMES),NO_NAMES;let names=new Set(patterns.flatMap((pattern)=>extractIdentifiers2(pattern)).map((id)=>id.name));if(isFunction(node)){let{body}=node;walk2(body,{enter(inner){if(inner===body)return;if(inner.type==="VariableDeclaration")for(let declarator of inner.declarations)for(let id of extractIdentifiers2(declarator.id))names.add(id.name);else if((inner.type==="FunctionDeclaration"||inner.type==="ClassDeclaration")&&inner.id)names.add(inner.id.name);return isFunction(inner)?SKIP2:void 0}})}return scopes.set(node,names),names}function isFunction(node){return node.type==="ArrowFunctionExpression"||node.type==="FunctionExpression"||node.type==="FunctionDeclaration"}function declare(program,into,instance){let implicit=[];walk2(program,{enter(node,parent){if(isFunction(node)&&node.type!=="FunctionDeclaration")return SKIP2;let topLevel=parent===program||parent?.type==="ExportNamedDeclaration"||parent?.type==="ExportDefaultDeclaration";if(node.type==="ImportDeclaration"){for(let specifier of node.specifiers)into.set(specifier.local.name,node);return SKIP2}if(node.type==="FunctionDeclaration"||node.type==="ClassDeclaration"){if(topLevel&&node.id)into.set(node.id.name,node);return SKIP2}if(node.type==="VariableDeclaration"){if(node.kind!=="var"&&!topLevel)return SKIP2;for(let declarator of node.declarations)for(let id of extractIdentifiers2(declarator.id))into.set(id.name,topLevel?declarator.init??null:null);return SKIP2}if(instance&&parent===program&&node.type==="LabeledStatement"&&node.label.name==="$"&&node.body.type==="ExpressionStatement"&&node.body.expression.type==="AssignmentExpression"){for(let id of extractIdentifiers2(node.body.expression.left))if(!id.name.startsWith("$"))implicit.push(id)}return}});for(let id of implicit)if(!into.has(id.name))into.set(id.name,null)}function runeOf(initial,declared){if(initial?.type!=="CallExpression")return null;let node=initial.callee,keypath="";while(node.type==="MemberExpression"){if(node.computed||node.property.type!=="Identifier")return null;keypath=`.${node.property.name}${keypath}`,node=node.object}if(node.type==="CallExpression"&&node.callee.type==="Identifier")keypath=`()${keypath}`,node=node.callee;if(node.type!=="Identifier"||declared.has(node.name))return null;return keypath=node.name+keypath,RUNES.has(keypath)?keypath:null}export{isRunesMode};
|
package/scope.d.ts
CHANGED
|
@@ -127,7 +127,9 @@ export interface Scopes {
|
|
|
127
127
|
/**
|
|
128
128
|
* The scope `node` is in: for a function, the scope around it, while
|
|
129
129
|
* its parameters are in its own. `null` for a node in a type, in the
|
|
130
|
-
* `<style>` or outside the AST.
|
|
130
|
+
* `<style>` or outside the AST. The first call walks the AST again to
|
|
131
|
+
* record every node's scope, which the rest of the analysis doesn't
|
|
132
|
+
* need.
|
|
131
133
|
*/
|
|
132
134
|
scopeOf(node: AST.SvelteNode): Scope | null;
|
|
133
135
|
/**
|
package/scope.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{o,f}from"./shared-4wqe6a27.js";import{p,I,g}from"./shared-4zk9ntab.js";import{W,P}from"./shared-znzncsf2.js";class c{node;parent;porous;declarations=new Map;constructor(e,n,t){this.node=e,this.parent=n,this.porous=t}get(e){for(let n=this;n;n=n.parent){let t=n.declarations.get(e);if(t!==void 0)return t}return null}}class v{name;kind;node;declaration;initial;scope;references=[];rune=null;prop=null;constructor(e,n,t,i,r,s){this.name=e,this.kind=n,this.node=t,this.declaration=i,this.initial=r,this.scope=s}}class m{node;parent;scope;binding=null;reads;writes;mutates;store=!1;constructor(e,n,t,i,r,s){this.node=e,this.parent=n,this.scope=t,this.reads=i,this.writes=r,this.mutates=s}}var y=Object.assign(Object.create(null),g),b=new Set(["SvelteElement","RegularElement","SvelteFragment","Component","SvelteComponent","SvelteSelf","SlotElement"]),N=new Map;function R(e){return new S(e)}class S{module;instance;instanceProgram=null;component;scopeIn=new Map;made=new Map;declared=new Map;references=new Map;pending=[];declarators=[];implicit=[];stores=new Map;constructor(e){if(e.type==="Program")this.component=!1,this.module=new c(e,null,!1),this.instance=this.module,this.made.set(e,this.module),this.visit(e,null,this.module);else{this.component=!0;let n=e.module?.content??null,t=e.instance?.content??null;this.module=new c(n,null,!1),this.instance=new c(t,this.module,!1),this.instanceProgram=t,this.scopeIn.set(e,this.module);for(let[i,r]of[[e.module,this.module],[e.instance,this.instance]]){if(i===void 0)continue;this.scopeIn.set(i,r),this.made.set(i.content,r);for(let s of i.attributes)this.visit(s,i,r);this.visit(i.content,i,r)}this.visit(e.fragment,e,this.instance)}this.declareImplicit(),this.resolve(),this.findRunesAndProps()}scopeOf(e){return this.scopeIn.get(e)??null}bindingOf(e){return this.declared.get(e)??this.references.get(e)?.binding??null}referenceOf(e){return this.references.get(e)??null}declaredIn(e){return this.made.get(e)?.declarations??N}child(e,n,t){let i=new c(n,e,t);return this.made.set(n,i),i}declare(e,n,t,i,r,s){let l=e;if(i==="var")while(l.porous&&l.parent!==null)l=l.parent;let a=l.declarations.get(t);if(a!==void 0&&a.declaration.type!=="TSDeclareFunction"){if(n!==null)this.declared.set(n,a);return}let u=new v(t,i,n,r,s,l);if(l.declarations.set(t,u),n!==null)this.declared.set(n,u)}reference(e,n,t,i,r,s){this.pending.push(new m(e,n,t,i,r,s))}referenceName(e,n,t,i){let r=e.split(".")[0],s={type:"Identifier",name:r,start:n,end:n+r.length};this.scopeIn.set(s,i),this.reference(s,t,i,!0,!1,!1)}visit(e,n,t){switch(this.scopeIn.set(e,t),e.type){case"Identifier":if(n!==null&&I(e,n))this.reference(e,n,t,!0,!1,!1);this.visitFields(e,t);return;case"ImportDeclaration":for(let i of e.specifiers){if(this.scopeIn.set(i,t),this.scopeIn.set(i.local,t),i.type==="ImportSpecifier")this.scopeIn.set(i.imported,t);this.declare(t,i.local,i.local.name,"import",i,e)}this.visit(e.source,e,t);for(let i of e.attributes??[])this.visit(i,e,t);return;case"ExportNamedDeclaration":if(e.declaration)this.visit(e.declaration,e,t);for(let i of e.specifiers)if(this.scopeIn.set(i,t),this.scopeIn.set(i.local,t),this.scopeIn.set(i.exported,t),!e.source&&i.local.type==="Identifier")this.reference(i.local,i,t,!0,!1,!1);if(e.source)this.visit(e.source,e,t);for(let i of e.attributes??[])this.visit(i,e,t);return;case"VariableDeclaration":this.visitDeclaration(e,n,t);return;case"FunctionDeclaration":if(e.id)this.scopeIn.set(e.id,t),this.declare(t,e.id,e.id.name,"function",e,e);this.visitFunction(e,this.child(t,e,!0));return;case"FunctionExpression":{let i=this.child(t,e,!0);if(e.id)this.scopeIn.set(e.id,i),this.declare(i,e.id,e.id.name,"function",e,e);this.visitFunction(e,i);return}case"ArrowFunctionExpression":this.visitFunction(e,this.child(t,e,!0));return;case"ClassDeclaration":case"ClassExpression":{let i=t;if(e.id){if(e.type==="ClassExpression")i=this.child(t,e,!1);this.scopeIn.set(e.id,i),this.declare(i,e.id,e.id.name,"class",e,e)}for(let r of e.decorators??[])this.visit(r,e,t);if(e.superClass)this.visit(e.superClass,e,i);this.visit(e.body,e,i);return}case"BlockStatement":this.visitFields(e,this.child(t,e,!(n!==null&&T(n)&&n.body===e)));return;case"StaticBlock":this.visitFields(e,this.child(t,e,!1));return;case"ForStatement":case"SwitchStatement":this.visitFields(e,this.child(t,e,!0));return;case"ForInStatement":case"ForOfStatement":{let i=this.child(t,e,!0);if(e.left.type==="VariableDeclaration")this.visit(e.left,e,i);else this.visitTarget(e.left,e,i,!1);this.visit(e.right,e,i),this.visit(e.body,e,i);return}case"CatchClause":{if(!e.param)break;let i=this.child(t,e,!0);this.declarePattern(e.param,e,i,"catch",e,null),this.visit(e.body,e,i);return}case"AssignmentExpression":this.visitTarget(e.left,e,t,e.operator!=="="),this.visit(e.right,e,t);return;case"UpdateExpression":this.visitTarget(e.argument,e,t,!0);return;case"LabeledStatement":if(n===this.instanceProgram&&e.label.name==="$"){this.visitReactive(e,t);return}break;case"TSEnumDeclaration":{this.scopeIn.set(e.id,t),this.declare(t,e.id,e.id.name,"enum",e,e);let i=this.child(t,e,!1);for(let r of e.members)if(this.scopeIn.set(r,i),this.scopeIn.set(r.id,i),r.id.type==="Identifier")this.declare(i,r.id,r.id.name,"enum-member",r,r.initializer??null);for(let r of e.members)if(r.initializer)this.visit(r.initializer,r,i);return}case"TSModuleDeclaration":if(this.scopeIn.set(e.id,t),e.id.type==="Identifier"&&!e.global)this.declare(t,e.id,e.id.name,"namespace",e,e);if(e.body)this.visit(e.body,e,this.child(t,e,!1));return;case"TSImportEqualsDeclaration":{this.scopeIn.set(e.id,t),this.declare(t,e.id,e.id.name,"import",e,e.moduleReference);let i=e.moduleReference;while(i.type==="TSQualifiedName")this.scopeIn.set(i,t),this.scopeIn.set(i.right,t),i=i.left;if(i.type==="Identifier")this.scopeIn.set(i,t),this.reference(i,e,t,!0,!1,!1);else this.visit(i,e,t);return}case"TSDeclareFunction":if(e.id){if(this.scopeIn.set(e.id,t),!t.declarations.has(e.id.name))this.declare(t,e.id,e.id.name,"function",e,e)}return;case"Fragment":this.visitFields(e,this.child(t,e,!1));return;case"RegularElement":case"SvelteElement":case"SlotElement":case"SvelteFragment":this.visitFields(e,this.child(t,e,!1));return;case"Component":case"SvelteComponent":case"SvelteSelf":this.visitComponent(e,t);return;case"LetDirective":this.visitLet(e,t);return;case"EachBlock":this.visitEach(e,t);return;case"AwaitBlock":this.visitAwait(e,t);return;case"SnippetBlock":{this.scopeIn.set(e.expression,t);let{name:i}=e.expression;this.declare(t,e.expression,i,"snippet",e,e);let r=this.child(t,e,!1);for(let s of e.parameters??[])this.declarePattern(s,e,r,"snippet-param",e,null);this.visit(e.body,e,r);return}case"BindDirective":if(e.expression.type==="SequenceExpression")break;this.visitTarget(e.expression,e,t,!0);return;case"TransitionDirective":case"AnimateDirective":case"UseDirective":{this.referenceName(e.name,e.start+x(e),e,t);break}case"StyleDirective":if(e.value===!0)this.referenceName(e.name,e.start+6,e,t);break}this.visitFields(e,t)}visitFields(e,n){let t=y[e.type];if(t===void 0)throw Error(`unknown node type: ${e.type}`);let i=f(e);for(let r=0;r<t.length;r++){let s=i[t[r]];if(Array.isArray(s))for(let l=0;l<s.length;l++){let a=s[l];if(o(a))this.visit(a,e,n)}else if(o(s))this.visit(s,e,n)}}visitDeclaration(e,n,t){let i=e.kind==="await using"?"using":e.kind;if(n?.type==="ConstTag")i="const-tag";for(let r of e.declarations)if(this.scopeIn.set(r,t),this.declarePattern(r.id,r,t,i,r,r.init??null),this.declarators.push([r,t]),r.init)this.visit(r.init,r,t)}visitFunction(e,n){for(let t of e.params){if(t.type==="Identifier"&&t.name==="this"){this.scopeIn.set(t,n);continue}this.declarePattern(t,e,n,"param",e,null)}this.visit(e.body,e,n)}declarePattern(e,n,t,i,r,s){switch(this.scopeIn.set(e,t),e.type){case"Identifier":this.declare(t,e,e.name,i,r,s);break;case"ObjectPattern":for(let l of e.properties){if(this.scopeIn.set(l,t),l.type==="RestElement"){this.declarePattern(l,e,t,i,r,s);continue}if(l.computed)this.visit(l.key,l,t);else this.scopeIn.set(l.key,t);this.declarePattern(l.value,l,t,i,r,s)}break;case"ArrayPattern":for(let l of e.elements)if(l)this.declarePattern(l,e,t,i,r,s);break;case"RestElement":this.declarePattern(e.argument,e,t,i,r,s);break;case"AssignmentPattern":this.declarePattern(e.left,e,t,i,r,s),this.visit(e.right,e,t);break;case"TSParameterProperty":this.declarePattern(e.parameter,e,t,i,r,s);break;default:this.visit(e,n,t);return}if("decorators"in e&&e.decorators)for(let l of e.decorators)this.visit(l,e,t)}visitTarget(e,n,t,i){switch(this.scopeIn.set(e,t),e.type){case"Identifier":this.reference(e,n,t,i,!0,!1);return;case"MemberExpression":{let r=e,s=n;while(r.type==="MemberExpression"){if(this.scopeIn.set(r,t),r.computed)this.visit(r.property,r,t);else this.scopeIn.set(r.property,t);s=r,r=r.object}if(r.type==="Identifier")this.scopeIn.set(r,t),this.reference(r,s,t,!0,!1,!0);else this.visit(r,s,t);return}case"ObjectPattern":for(let r of e.properties){if(this.scopeIn.set(r,t),r.type==="RestElement"){this.visitTarget(r,e,t,!1);continue}if(r.computed)this.visit(r.key,r,t);else this.scopeIn.set(r.key,t);this.visitTarget(r.value,r,t,!1)}return;case"ArrayPattern":for(let r of e.elements)if(r)this.visitTarget(r,e,t,!1);return;case"RestElement":this.visitTarget(e.argument,e,t,!1);return;case"AssignmentPattern":this.visitTarget(e.left,e,t,!1),this.visit(e.right,e,t);return}if(e.type==="TSAsExpression"||e.type==="TSSatisfiesExpression"||e.type==="TSNonNullExpression"||e.type==="TSTypeAssertion"){this.visitTarget(e.expression,e,t,i);return}this.visit(e,n,t)}visitReactive(e,n){let t=this.child(n,e,!1);this.scopeIn.set(e.label,n);let{body:i}=e;if(i.type==="ExpressionStatement"&&i.expression.type==="AssignmentExpression"){let{left:r,right:s}=i.expression;for(let l of p(r))if(!l.name.startsWith("$"))this.implicit.push([l,e,s])}this.visit(i,e,t)}visitComponent(e,n){if(e.type==="Component")this.referenceName(e.name,e.start+1,e,n);let t=d(e)!==null,i=new c(e,n,!1),r=t?n:i;if(this.made.set(e,r),e.type==="SvelteComponent")this.visit(e.expression,e,n);for(let s of e.attributes)this.visit(s,e,s.type==="LetDirective"?r:n);this.scopeIn.set(e.fragment,i);for(let s of e.fragment.nodes){let l=d(s);this.visit(s,e.fragment,l===null?i:this.child(n,s,!1))}}visitLet(e,n){if(e.expression===null){this.declare(n,null,e.name,"let-directive",e,null);return}let t=(i)=>{switch(this.scopeIn.set(i,n),i.type){case"Identifier":this.declare(n,i,i.name,"let-directive",e,null);return;case"ObjectExpression":for(let r of i.properties)if(this.scopeIn.set(r,n),r.type==="SpreadElement")t(r.argument);else this.scopeIn.set(r.key,n),t(r.value);return;case"ArrayExpression":for(let r of i.elements){if(r===null)continue;if(r.type==="SpreadElement")this.scopeIn.set(r,n),t(r.argument);else t(r)}}};t(e.expression)}visitEach(e,n){if(this.visit(e.expression,e,n),e.fallback)this.visit(e.fallback,e,n);let t=this.child(n,e,!1);if(e.context)this.declarePattern(e.context,e,t,"each",e,null);if(e.index!==void 0)this.declare(t,null,e.index,"each-index",e,e);if(e.key)this.visit(e.key,e,t);this.scopeIn.set(e.body,t);for(let i of e.body.nodes)this.visit(i,e.body,t)}visitAwait(e,n){if(this.visit(e.expression,e,n),e.pending)this.visit(e.pending,e,n);for(let[t,i,r]of[[e.then,e.value,"await-value"],[e.catch,e.error,"await-error"]]){if(t===null)continue;this.visit(t,e,n);let s=this.made.get(t);if(i!==null&&s!==void 0)this.declarePattern(i,e,s,r,e,null)}}declareImplicit(){for(let[e,n,t]of this.implicit)if(this.instance.get(e.name)===null)this.declare(this.instance,e,e.name,"reactive",n,t)}resolve(){let e=new Set;for(let n of this.pending){let{node:t}=n,i=this.declared.get(t);if(i!==void 0&&i.kind!=="reactive")continue;this.references.set(t,n);let r=n.scope.get(t.name);if(r===null&&this.component){let s=this.storeOf(t.name);if(s!==!1)n.store=!0,n.mutates||=n.writes,n.reads=!0,n.writes=!1,r=s}if(r!==null){n.binding=r;let s=r.references.at(-1);if(s!==void 0&&s.node.start>t.start)e.add(r);r.references.push(n)}}for(let n of e)n.references.sort((t,i)=>t.node.start-i.node.start)}storeOf(e){let n=this.stores.get(e);if(n!==void 0)return n;let t=!1;if(e.length>1&&e.startsWith("$")&&!e.startsWith("$$")){let i=this.instance.get(e.slice(1));if(!P.has(e))t=i;else if(i!==null){let r=i.initial,s=h(r,this.instance,null);if((s===null||e!=="$props"&&s==="$props")&&!(e==="$derived"&&r?.type==="ImportDeclaration"&&r.source.value==="svelte/store"))t=i}}return this.stores.set(e,t),t}findRunesAndProps(){for(let[e,n]of this.declarators){let t=h(e.init??null,n,this.references);if(t===null)continue;for(let i of p(e.id)){let r=this.declared.get(i);if(r?.declaration===e)r.rune=t}if(t!=="$props")continue;if(e.id.type==="Identifier"){let i=this.declared.get(e.id);if(i)i.initial=null;continue}if(e.id.type!=="ObjectPattern")continue;for(let i of e.id.properties){if(i.type==="RestElement"){for(let l of p(i)){let a=this.declared.get(l);if(a)a.initial=null}continue}let r=i.value.type==="AssignmentPattern"?i.value.left:i.value,s=r.type==="Identifier"?this.declared.get(r):void 0;if(s===void 0||i.computed)continue;s.prop=E(i.key),s.initial=i.value.type==="AssignmentPattern"?A(i.value.right):null}}this.findLegacyProps()}findLegacyProps(){if(this.instanceProgram===null)return;for(let e of this.instanceProgram.body){if(e.type!=="ExportNamedDeclaration")continue;let{declaration:n}=e;if(n?.type==="VariableDeclaration"){if(n.kind!=="let"&&n.kind!=="var")continue;for(let t of n.declarations)for(let i of p(t.id)){let r=this.declared.get(i);if(r)r.prop=i.name}continue}if(e.source)continue;for(let t of e.specifiers){if(t.local.type!=="Identifier")continue;let i=this.instance.declarations.get(t.local.name);if(i?.kind!=="let"&&i?.kind!=="var")continue;i.prop=t.exported.type==="Identifier"?t.exported.name:String(t.exported.value)}}}}function T(e){return e.type==="ArrowFunctionExpression"||e.type==="FunctionExpression"||e.type==="FunctionDeclaration"}function d(e){if(!b.has(e.type)||!("attributes"in e))return null;for(let n of e.attributes??[])if(n.type==="Attribute"&&n.name==="slot"&&Array.isArray(n.value)&&n.value.length===1&&n.value[0].type==="Text")return n.value[0].data;return null}function h(e,n,t){if(e?.type!=="CallExpression")return null;let i=e.callee,r="";while(i.type==="MemberExpression"){if(i.computed||i.property.type!=="Identifier")return null;r=`.${i.property.name}${r}`,i=i.object}if(i.type==="CallExpression"&&i.callee.type==="Identifier")r=`()${r}`,i=i.callee;if(i.type!=="Identifier")return null;if(t!==null){let s=t.get(i);if(s?.binding!==null||s.store)return null}else if(n.get(i.name)!==null)return null;return r=i.name+r,W.has(r)?r:null}function A(e){if(e.type==="CallExpression"&&e.callee.type==="Identifier"&&e.callee.name==="$bindable"){let[n]=e.arguments;return n===void 0||n.type==="SpreadElement"?null:n}return e}function x(e){if(e.type==="UseDirective")return 4;if(e.type==="AnimateDirective")return 8;if(e.intro&&e.outro)return 11;return e.intro?3:4}function E(e){if(e.type==="Identifier")return e.name;return e.type==="Literal"?String(e.value):null}export{R as analyzeScopes};
|
|
1
|
+
import{isNode,fieldsOf}from"./shared-m0dcdh24.js";import{extractIdentifiers2,isReference2,valueVisitorKeys2}from"./shared-jpvd0875.js";import{RUNES,RUNE_NAMES}from"./shared-m3dr31c3.js";class ScopeNode{node;parent;porous;index;declarations=new Map;constructor(node,parent,porous,index){this.node=node,this.parent=parent,this.porous=porous,this.index=index}get(name){for(let scope=this;scope;scope=scope.parent){let binding=scope.declarations.get(name);if(binding!==void 0)return binding}return null}}class BindingNode{name;kind;node;declaration;initial;scope;references=[];rune=null;prop=null;constructor(name,kind,node,declaration,initial,scope){this.name=name,this.kind=kind,this.node=node,this.declaration=declaration,this.initial=initial,this.scope=scope}}class ReferenceNode{node;parent;scope;binding=null;reads;writes;mutates;store=!1;constructor(node,parent,scope,reads,writes,mutates){this.node=node,this.parent=parent,this.scope=scope,this.reads=reads,this.writes=writes,this.mutates=mutates}}var keysByType=Object.assign(Object.create(null),valueVisitorKeys2),ELEMENTS=new Set(["SvelteElement","RegularElement","SvelteFragment","Component","SvelteComponent","SvelteSelf","SlotElement"]),NO_BINDINGS=new Map;function analyzeScopes(ast){return new Analysis(ast,!1)}class Analysis{module;instance;instanceProgram=null;component;ast;scopes=[];scopeIn;synthetic=new Map;recorded;made=new Map;declared=new Map;references=new Map;pending=[];declarators=[];implicit=[];stores=new Map;constructor(ast,record){if(this.ast=ast,this.scopeIn=record?new Map:null,ast.type==="Program")this.component=!1,this.module=this.scope(ast,null,!1),this.instance=this.module,this.made.set(ast,this.module),this.visit(ast,null,this.module);else{this.component=!0;let module=ast.module?.content??null,instance=ast.instance?.content??null;this.module=this.scope(module,null,!1),this.instance=this.scope(instance,this.module,!1),this.instanceProgram=instance,this.scopeIn?.set(ast,this.module);for(let[script,scope]of[[ast.module,this.module],[ast.instance,this.instance]]){if(script===void 0)continue;this.scopeIn?.set(script,scope),this.made.set(script.content,scope);for(let attribute of script.attributes)this.visit(attribute,script,scope);this.visit(script.content,script,scope)}this.visit(ast.fragment,ast,this.instance)}this.declareImplicit(),this.resolve(),this.findRunesAndProps()}scopeOf(node){let synthetic=this.synthetic.get(node);if(synthetic!==void 0)return synthetic;if(this.scopeIn!==null)return this.scopeIn.get(node)??null;this.recorded??=new Analysis(this.ast,!0);let recorded=this.recorded.scopeIn?.get(node);return recorded===void 0?null:this.scopes[recorded.index]}scope(node,parent,porous){let scope=new ScopeNode(node,parent,porous,this.scopes.length);return this.scopes.push(scope),scope}bindingOf(node){return this.declared.get(node)??this.references.get(node)?.binding??null}referenceOf(node){return this.references.get(node)??null}declaredIn(node){return this.made.get(node)?.declarations??NO_BINDINGS}child(scope,node,porous){let made=this.scope(node,scope,porous);return this.made.set(node,made),made}declare(scope,node,name,kind,declaration,initial){let target=scope;if(kind==="var")while(target.porous&&target.parent!==null)target=target.parent;let existing=target.declarations.get(name);if(existing!==void 0&&existing.declaration.type!=="TSDeclareFunction"){if(node!==null)this.declared.set(node,existing);return}let binding=new BindingNode(name,kind,node,declaration,initial,target);if(target.declarations.set(name,binding),node!==null)this.declared.set(node,binding)}reference(node,parent,scope,reads,writes,mutates){this.pending.push(new ReferenceNode(node,parent,scope,reads,writes,mutates))}referenceName(name,start,parent,scope){let root=name.split(".")[0],node={type:"Identifier",name:root,start,end:start+root.length};this.synthetic.set(node,scope),this.reference(node,parent,scope,!0,!1,!1)}visit(node,parent,scope){switch(this.scopeIn?.set(node,scope),node.type){case"Identifier":if(parent!==null&&isReference2(node,parent))this.reference(node,parent,scope,!0,!1,!1);this.visitFields(node,scope);return;case"ImportDeclaration":for(let specifier of node.specifiers){if(this.scopeIn?.set(specifier,scope),this.scopeIn?.set(specifier.local,scope),specifier.type==="ImportSpecifier")this.scopeIn?.set(specifier.imported,scope);this.declare(scope,specifier.local,specifier.local.name,"import",specifier,node)}this.visit(node.source,node,scope);for(let attribute of node.attributes??[])this.visit(attribute,node,scope);return;case"ExportNamedDeclaration":if(node.declaration)this.visit(node.declaration,node,scope);for(let specifier of node.specifiers)if(this.scopeIn?.set(specifier,scope),this.scopeIn?.set(specifier.local,scope),this.scopeIn?.set(specifier.exported,scope),!node.source&&specifier.local.type==="Identifier")this.reference(specifier.local,specifier,scope,!0,!1,!1);if(node.source)this.visit(node.source,node,scope);for(let attribute of node.attributes??[])this.visit(attribute,node,scope);return;case"VariableDeclaration":this.visitDeclaration(node,parent,scope);return;case"FunctionDeclaration":if(node.id)this.scopeIn?.set(node.id,scope),this.declare(scope,node.id,node.id.name,"function",node,node);this.visitFunction(node,this.child(scope,node,!0));return;case"FunctionExpression":{let inner=this.child(scope,node,!0);if(node.id)this.scopeIn?.set(node.id,inner),this.declare(inner,node.id,node.id.name,"function",node,node);this.visitFunction(node,inner);return}case"ArrowFunctionExpression":this.visitFunction(node,this.child(scope,node,!0));return;case"ClassDeclaration":case"ClassExpression":{let inner=scope;if(node.id){if(node.type==="ClassExpression")inner=this.child(scope,node,!1);this.scopeIn?.set(node.id,inner),this.declare(inner,node.id,node.id.name,"class",node,node)}for(let decorator of node.decorators??[])this.visit(decorator,node,scope);if(node.superClass)this.visit(node.superClass,node,inner);this.visit(node.body,node,inner);return}case"BlockStatement":this.visitFields(node,this.child(scope,node,!(parent!==null&&isFunction(parent)&&parent.body===node)));return;case"StaticBlock":this.visitFields(node,this.child(scope,node,!1));return;case"ForStatement":case"SwitchStatement":this.visitFields(node,this.child(scope,node,!0));return;case"ForInStatement":case"ForOfStatement":{let inner=this.child(scope,node,!0);if(node.left.type==="VariableDeclaration")this.visit(node.left,node,inner);else this.visitTarget(node.left,node,inner,!1);this.visit(node.right,node,inner),this.visit(node.body,node,inner);return}case"CatchClause":{if(!node.param)break;let inner=this.child(scope,node,!0);this.declarePattern(node.param,node,inner,"catch",node,null),this.visit(node.body,node,inner);return}case"AssignmentExpression":this.visitTarget(node.left,node,scope,node.operator!=="="),this.visit(node.right,node,scope);return;case"UpdateExpression":this.visitTarget(node.argument,node,scope,!0);return;case"LabeledStatement":if(parent===this.instanceProgram&&node.label.name==="$"){this.visitReactive(node,scope);return}break;case"TSEnumDeclaration":{this.scopeIn?.set(node.id,scope),this.declare(scope,node.id,node.id.name,"enum",node,node);let inner=this.child(scope,node,!1);for(let member of node.members)if(this.scopeIn?.set(member,inner),this.scopeIn?.set(member.id,inner),member.id.type==="Identifier")this.declare(inner,member.id,member.id.name,"enum-member",member,member.initializer??null);for(let member of node.members)if(member.initializer)this.visit(member.initializer,member,inner);return}case"TSModuleDeclaration":if(this.scopeIn?.set(node.id,scope),node.id.type==="Identifier"&&!node.global)this.declare(scope,node.id,node.id.name,"namespace",node,node);if(node.body)this.visit(node.body,node,this.child(scope,node,!1));return;case"TSImportEqualsDeclaration":{this.scopeIn?.set(node.id,scope),this.declare(scope,node.id,node.id.name,"import",node,node.moduleReference);let name=node.moduleReference;while(name.type==="TSQualifiedName")this.scopeIn?.set(name,scope),this.scopeIn?.set(name.right,scope),name=name.left;if(name.type==="Identifier")this.scopeIn?.set(name,scope),this.reference(name,node,scope,!0,!1,!1);else this.visit(name,node,scope);return}case"TSDeclareFunction":if(node.id){if(this.scopeIn?.set(node.id,scope),!scope.declarations.has(node.id.name))this.declare(scope,node.id,node.id.name,"function",node,node)}return;case"Fragment":this.visitFields(node,this.child(scope,node,!1));return;case"RegularElement":case"SvelteElement":case"SlotElement":case"SvelteFragment":this.visitFields(node,this.child(scope,node,!1));return;case"Component":case"SvelteComponent":case"SvelteSelf":this.visitComponent(node,scope);return;case"LetDirective":this.visitLet(node,scope);return;case"EachBlock":this.visitEach(node,scope);return;case"AwaitBlock":this.visitAwait(node,scope);return;case"SnippetBlock":{this.scopeIn?.set(node.expression,scope);let{name}=node.expression;this.declare(scope,node.expression,name,"snippet",node,node);let inner=this.child(scope,node,!1);for(let parameter of node.parameters??[])this.declarePattern(parameter,node,inner,"snippet-param",node,null);this.visit(node.body,node,inner);return}case"BindDirective":if(node.expression.type==="SequenceExpression")break;this.visitTarget(node.expression,node,scope,!0);return;case"TransitionDirective":case"AnimateDirective":case"UseDirective":{this.referenceName(node.name,node.start+prefixLength(node),node,scope);break}case"StyleDirective":if(node.value===!0)this.referenceName(node.name,node.start+6,node,scope);break}this.visitFields(node,scope)}visitFields(node,scope){let keys=keysByType[node.type];if(keys===void 0)throw Error(`unknown node type: ${node.type}`);let fields=fieldsOf(node);for(let k=0;k<keys.length;k++){let value=fields[keys[k]];if(Array.isArray(value))for(let i=0;i<value.length;i++){let child=value[i];if(isNode(child))this.visit(child,node,scope)}else if(isNode(value))this.visit(value,node,scope)}}visitDeclaration(node,parent,scope){let kind=node.kind==="await using"?"using":node.kind;if(parent?.type==="ConstTag")kind="const-tag";for(let declarator of node.declarations)if(this.scopeIn?.set(declarator,scope),this.declarePattern(declarator.id,declarator,scope,kind,declarator,declarator.init??null),this.declarators.push([declarator,scope]),declarator.init)this.visit(declarator.init,declarator,scope)}visitFunction(node,scope){for(let param of node.params){if(param.type==="Identifier"&¶m.name==="this"){this.scopeIn?.set(param,scope);continue}this.declarePattern(param,node,scope,"param",node,null)}this.visit(node.body,node,scope)}declarePattern(pattern,parent,scope,kind,declaration,initial){switch(this.scopeIn?.set(pattern,scope),pattern.type){case"Identifier":this.declare(scope,pattern,pattern.name,kind,declaration,initial);break;case"ObjectPattern":for(let property of pattern.properties){if(this.scopeIn?.set(property,scope),property.type==="RestElement"){this.declarePattern(property,pattern,scope,kind,declaration,initial);continue}if(property.computed)this.visit(property.key,property,scope);else this.scopeIn?.set(property.key,scope);this.declarePattern(property.value,property,scope,kind,declaration,initial)}break;case"ArrayPattern":for(let element of pattern.elements)if(element)this.declarePattern(element,pattern,scope,kind,declaration,initial);break;case"RestElement":this.declarePattern(pattern.argument,pattern,scope,kind,declaration,initial);break;case"AssignmentPattern":this.declarePattern(pattern.left,pattern,scope,kind,declaration,initial),this.visit(pattern.right,pattern,scope);break;case"TSParameterProperty":this.declarePattern(pattern.parameter,pattern,scope,kind,declaration,initial);break;default:this.visit(pattern,parent,scope);return}if("decorators"in pattern&&pattern.decorators)for(let decorator of pattern.decorators)this.visit(decorator,pattern,scope)}visitTarget(target,parent,scope,reads){switch(this.scopeIn?.set(target,scope),target.type){case"Identifier":this.reference(target,parent,scope,reads,!0,!1);return;case"MemberExpression":{let object=target,holder=parent;while(object.type==="MemberExpression"){if(this.scopeIn?.set(object,scope),object.computed)this.visit(object.property,object,scope);else this.scopeIn?.set(object.property,scope);holder=object,object=object.object}if(object.type==="Identifier")this.scopeIn?.set(object,scope),this.reference(object,holder,scope,!0,!1,!0);else this.visit(object,holder,scope);return}case"ObjectPattern":for(let property of target.properties){if(this.scopeIn?.set(property,scope),property.type==="RestElement"){this.visitTarget(property,target,scope,!1);continue}if(property.computed)this.visit(property.key,property,scope);else this.scopeIn?.set(property.key,scope);this.visitTarget(property.value,property,scope,!1)}return;case"ArrayPattern":for(let element of target.elements)if(element)this.visitTarget(element,target,scope,!1);return;case"RestElement":this.visitTarget(target.argument,target,scope,!1);return;case"AssignmentPattern":this.visitTarget(target.left,target,scope,!1),this.visit(target.right,target,scope);return}if(target.type==="TSAsExpression"||target.type==="TSSatisfiesExpression"||target.type==="TSNonNullExpression"||target.type==="TSTypeAssertion"){this.visitTarget(target.expression,target,scope,reads);return}this.visit(target,parent,scope)}visitReactive(node,scope){let inner=this.child(scope,node,!1);this.scopeIn?.set(node.label,scope);let{body}=node;if(body.type==="ExpressionStatement"&&body.expression.type==="AssignmentExpression"){let{left,right}=body.expression;for(let id of extractIdentifiers2(left))if(!id.name.startsWith("$"))this.implicit.push([id,node,right])}this.visit(body,node,inner)}visitComponent(node,scope){if(node.type==="Component")this.referenceName(node.name,node.start+1,node,scope);let slotted=slotOf(node)!==null,defaults=this.scope(node,scope,!1),lets=slotted?scope:defaults;if(this.made.set(node,lets),node.type==="SvelteComponent")this.visit(node.expression,node,scope);for(let attribute of node.attributes)this.visit(attribute,node,attribute.type==="LetDirective"?lets:scope);this.scopeIn?.set(node.fragment,defaults);for(let child of node.fragment.nodes){let slot=slotOf(child);this.visit(child,node.fragment,slot===null?defaults:this.child(scope,child,!1))}}visitLet(node,scope){if(node.expression===null){this.declare(scope,null,node.name,"let-directive",node,null);return}let declare=(expression)=>{switch(this.scopeIn?.set(expression,scope),expression.type){case"Identifier":this.declare(scope,expression,expression.name,"let-directive",node,null);return;case"ObjectExpression":for(let property of expression.properties)if(this.scopeIn?.set(property,scope),property.type==="SpreadElement")declare(property.argument);else this.scopeIn?.set(property.key,scope),declare(property.value);return;case"ArrayExpression":for(let element of expression.elements){if(element===null)continue;if(element.type==="SpreadElement")this.scopeIn?.set(element,scope),declare(element.argument);else declare(element)}}};declare(node.expression)}visitEach(node,scope){if(this.visit(node.expression,node,scope),node.fallback)this.visit(node.fallback,node,scope);let inner=this.child(scope,node,!1);if(node.context)this.declarePattern(node.context,node,inner,"each",node,null);if(node.index!==void 0)this.declare(inner,null,node.index,"each-index",node,node);if(node.key)this.visit(node.key,node,inner);this.scopeIn?.set(node.body,inner);for(let child of node.body.nodes)this.visit(child,node.body,inner)}visitAwait(node,scope){if(this.visit(node.expression,node,scope),node.pending)this.visit(node.pending,node,scope);for(let[fragment,pattern,kind]of[[node.then,node.value,"await-value"],[node.catch,node.error,"await-error"]]){if(fragment===null)continue;this.visit(fragment,node,scope);let inner=this.made.get(fragment);if(pattern!==null&&inner!==void 0)this.declarePattern(pattern,node,inner,kind,node,null)}}declareImplicit(){for(let[id,label,right]of this.implicit)if(this.instance.get(id.name)===null)this.declare(this.instance,id,id.name,"reactive",label,right)}resolve(){let unordered=new Set;for(let reference of this.pending){let{node}=reference,declared=this.declared.get(node);if(declared!==void 0&&declared.kind!=="reactive")continue;this.references.set(node,reference);let binding=reference.scope.get(node.name);if(binding===null&&this.component){let store=this.storeOf(node.name);if(store!==!1)reference.store=!0,reference.mutates||=reference.writes,reference.reads=!0,reference.writes=!1,binding=store}if(binding!==null){reference.binding=binding;let last=binding.references.at(-1);if(last!==void 0&&last.node.start>node.start)unordered.add(binding);binding.references.push(reference)}}for(let binding of unordered)binding.references.sort((a,b)=>a.node.start-b.node.start)}storeOf(name){let cached=this.stores.get(name);if(cached!==void 0)return cached;let store=!1;if(name.length>1&&name.startsWith("$")&&!name.startsWith("$$")){let declaration=this.instance.get(name.slice(1));if(!RUNE_NAMES.has(name))store=declaration;else if(declaration!==null){let initial=declaration.initial,rune=runeOf(initial,this.instance,null);if((rune===null||name!=="$props"&&rune==="$props")&&!(name==="$derived"&&initial?.type==="ImportDeclaration"&&initial.source.value==="svelte/store"))store=declaration}}return this.stores.set(name,store),store}findRunesAndProps(){for(let[declarator,scope]of this.declarators){let rune=runeOf(declarator.init??null,scope,this.references);if(rune===null)continue;for(let id of extractIdentifiers2(declarator.id)){let binding=this.declared.get(id);if(binding?.declaration===declarator)binding.rune=rune}if(rune!=="$props")continue;if(declarator.id.type==="Identifier"){let binding=this.declared.get(declarator.id);if(binding)binding.initial=null;continue}if(declarator.id.type!=="ObjectPattern")continue;for(let property of declarator.id.properties){if(property.type==="RestElement"){for(let id of extractIdentifiers2(property)){let binding=this.declared.get(id);if(binding)binding.initial=null}continue}let value=property.value.type==="AssignmentPattern"?property.value.left:property.value,binding=value.type==="Identifier"?this.declared.get(value):void 0;if(binding===void 0||property.computed)continue;binding.prop=keyName(property.key),binding.initial=property.value.type==="AssignmentPattern"?unwrapBindable(property.value.right):null}}this.findLegacyProps()}findLegacyProps(){if(this.instanceProgram===null)return;for(let statement of this.instanceProgram.body){if(statement.type!=="ExportNamedDeclaration")continue;let{declaration}=statement;if(declaration?.type==="VariableDeclaration"){if(declaration.kind!=="let"&&declaration.kind!=="var")continue;for(let declarator of declaration.declarations)for(let id of extractIdentifiers2(declarator.id)){let binding=this.declared.get(id);if(binding)binding.prop=id.name}continue}if(statement.source)continue;for(let specifier of statement.specifiers){if(specifier.local.type!=="Identifier")continue;let binding=this.instance.declarations.get(specifier.local.name);if(binding?.kind!=="let"&&binding?.kind!=="var")continue;binding.prop=specifier.exported.type==="Identifier"?specifier.exported.name:String(specifier.exported.value)}}}}function isFunction(node){return node.type==="ArrowFunctionExpression"||node.type==="FunctionExpression"||node.type==="FunctionDeclaration"}function slotOf(node){if(!ELEMENTS.has(node.type)||!("attributes"in node))return null;for(let attribute of node.attributes??[])if(attribute.type==="Attribute"&&attribute.name==="slot"&&Array.isArray(attribute.value)&&attribute.value.length===1&&attribute.value[0].type==="Text")return attribute.value[0].data;return null}function runeOf(initial,scope,references){if(initial?.type!=="CallExpression")return null;let node=initial.callee,keypath="";while(node.type==="MemberExpression"){if(node.computed||node.property.type!=="Identifier")return null;keypath=`.${node.property.name}${keypath}`,node=node.object}if(node.type==="CallExpression"&&node.callee.type==="Identifier")keypath=`()${keypath}`,node=node.callee;if(node.type!=="Identifier")return null;if(references!==null){let reference=references.get(node);if(reference?.binding!==null||reference.store)return null}else if(scope.get(node.name)!==null)return null;return keypath=node.name+keypath,RUNES.has(keypath)?keypath:null}function unwrapBindable(node){if(node.type==="CallExpression"&&node.callee.type==="Identifier"&&node.callee.name==="$bindable"){let[argument]=node.arguments;return argument===void 0||argument.type==="SpreadElement"?null:argument}return node}function prefixLength(node){if(node.type==="UseDirective")return 4;if(node.type==="AnimateDirective")return 8;if(node.intro&&node.outro)return 11;return node.intro?3:4}function keyName(key){if(key.type==="Identifier")return key.name;return key.type==="Literal"?String(key.value):null}export{analyzeScopes};
|