From 19d66d9bd993d6b202963ee3667e57c0b543555f Mon Sep 17 00:00:00 2001 From: baseballyama Date: Fri, 24 Nov 2023 00:40:17 +0900 Subject: [PATCH 1/2] add .active --- src/parser/typescript/analyze/index.ts | 114 ++++++++++++++----------- 1 file changed, 62 insertions(+), 52 deletions(-) diff --git a/src/parser/typescript/analyze/index.ts b/src/parser/typescript/analyze/index.ts index d1f25dee..e76ef9aa 100644 --- a/src/parser/typescript/analyze/index.ts +++ b/src/parser/typescript/analyze/index.ts @@ -313,27 +313,30 @@ function analyzeRuneVariables( } switch (globalName) { case "$state": { - appendDeclareFunctionVirtualScript(globalName, "(initial: T): T"); - appendDeclareFunctionVirtualScript(globalName, "(): T | undefined"); + appendDeclareFunctionVirtualScripts(globalName, [ + "(initial: T): T", + "(): T | undefined", + ]); break; } case "$derived": { - appendDeclareFunctionVirtualScript(globalName, "(expression: T): T"); + appendDeclareFunctionVirtualScripts(globalName, [ + "(expression: T): T", + ]); break; } case "$effect": { - appendDeclareFunctionVirtualScript( - globalName, + appendDeclareFunctionVirtualScripts(globalName, [ "(fn: () => void | (() => void)): void", - ); - appendDeclareNamespaceVirtualScript( - globalName, + ]); + appendDeclareNamespaceVirtualScripts(globalName, [ "export function pre(fn: () => void | (() => void)): void;", - ); + "export function active(): boolean;", + ]); break; } case "$props": { - appendDeclareFunctionVirtualScript(globalName, "(): T"); + appendDeclareFunctionVirtualScripts(globalName, ["(): T"]); break; } default: { @@ -344,56 +347,63 @@ function analyzeRuneVariables( } /** Append declare virtual script */ - function appendDeclareFunctionVirtualScript(name: string, type: string) { - ctx.appendVirtualScript(`declare function ${name}${type};`); - ctx.restoreContext.addRestoreStatementProcess((node, result) => { - if ( - node.type !== "TSDeclareFunction" || - !node.declare || - node.id?.type !== "Identifier" || - node.id.name !== name - ) { - return false; - } - const program = result.ast; - program.body.splice(program.body.indexOf(node), 1); + function appendDeclareFunctionVirtualScripts(name: string, types: string[]) { + for (const type of types) { + ctx.appendVirtualScript(`declare function ${name}${type};`); + ctx.restoreContext.addRestoreStatementProcess((node, result) => { + if ( + node.type !== "TSDeclareFunction" || + !node.declare || + node.id?.type !== "Identifier" || + node.id.name !== name + ) { + return false; + } + const program = result.ast; + program.body.splice(program.body.indexOf(node), 1); - const scopeManager = result.scopeManager as ScopeManager; + const scopeManager = result.scopeManager as ScopeManager; - // Remove `declare` variable - removeAllScopeAndVariableAndReference(node, { - visitorKeys: result.visitorKeys, - scopeManager, - }); + // Remove `declare` variable + removeAllScopeAndVariableAndReference(node, { + visitorKeys: result.visitorKeys, + scopeManager, + }); - return true; - }); + return true; + }); + } } - function appendDeclareNamespaceVirtualScript(name: string, script: string) { - ctx.appendVirtualScript(`declare namespace $effect { ${script} }`); - ctx.restoreContext.addRestoreStatementProcess((node, result) => { - if ( - node.type !== "TSModuleDeclaration" || - !node.declare || - node.id?.type !== "Identifier" || - node.id.name !== name - ) { - return false; - } - const program = result.ast; - program.body.splice(program.body.indexOf(node), 1); + function appendDeclareNamespaceVirtualScripts( + name: string, + scripts: string[], + ) { + for (const script of scripts) { + ctx.appendVirtualScript(`declare namespace ${name} { ${script} }`); + ctx.restoreContext.addRestoreStatementProcess((node, result) => { + if ( + node.type !== "TSModuleDeclaration" || + !node.declare || + node.id?.type !== "Identifier" || + node.id.name !== name + ) { + return false; + } + const program = result.ast; + program.body.splice(program.body.indexOf(node), 1); - const scopeManager = result.scopeManager as ScopeManager; + const scopeManager = result.scopeManager as ScopeManager; - // Remove `declare` variable - removeAllScopeAndVariableAndReference(node, { - visitorKeys: result.visitorKeys, - scopeManager, - }); + // Remove `declare` variable + removeAllScopeAndVariableAndReference(node, { + visitorKeys: result.visitorKeys, + scopeManager, + }); - return true; - }); + return true; + }); + } } } From eb71c922d326a081865a1a6287cfaeb63aeda46f Mon Sep 17 00:00:00 2001 From: baseballyama Date: Fri, 24 Nov 2023 00:41:16 +0900 Subject: [PATCH 2/2] add changeset --- .changeset/nine-pandas-fly.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/nine-pandas-fly.md diff --git a/.changeset/nine-pandas-fly.md b/.changeset/nine-pandas-fly.md new file mode 100644 index 00000000..646b06c7 --- /dev/null +++ b/.changeset/nine-pandas-fly.md @@ -0,0 +1,5 @@ +--- +"svelte-eslint-parser": minor +--- + +feat: add type of `$effect.active`