Skip to content

Commit ef455c3

Browse files
committed
fix: return tags api overloads
1 parent 5c03f6c commit ef455c3

File tree

9 files changed

+137
-97
lines changed

9 files changed

+137
-97
lines changed

.changeset/curvy-readers-study.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
"@marko/language-server": patch
3+
"@marko/language-tools": patch
4+
"@marko/type-check": patch
5+
"marko-vscode": patch
6+
---
7+
8+
Fix return api overloads for tags api components.

package-lock.json

Lines changed: 101 additions & 80 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"prettier": "^3.6.2",
1919
"tsx": "^4.20.3",
2020
"typescript": "^5.8.3",
21-
"typescript-eslint": "^8.36.0"
21+
"typescript-eslint": "^8.37.0"
2222
},
2323
"private": true,
2424
"scripts": {

packages/language-server/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
"@marko/language-tools": "^2.5.25",
1212
"@marko/babel-utils": "^6.6.3",
1313
"@marko/compiler": "^5.39.29",
14-
"htmljs-parser": "^5.5.4",
14+
"htmljs-parser": "^5.6.1",
1515
"marko": "^5.37.41",
1616
"prettier": "^3.6.2",
17-
"prettier-plugin-marko": "^3.2.1",
17+
"prettier-plugin-marko": "^3.2.7",
1818
"relative-import-path": "^1.0.0",
1919
"typescript": "^5.8.3",
2020
"vscode-css-languageservice": "^6.3.7",

packages/language-tools/marko.internal.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ declare global {
135135
: Handler
136136
: (...args: any) => any; // If typescript ever actually supports partial application maybe we do this.
137137

138-
export function renderTemplate<Name extends Marko.Template>(
138+
export function renderTemplate<Name extends Marko.Template<any, any>>(
139139
template: Name,
140140
): TemplateRenderer<Name>;
141141
export function renderNativeTag<Name extends string>(
@@ -328,7 +328,7 @@ declare global {
328328
// currently falls back to DefaultRenderer too eagerly.
329329
export type DynamicRenderer<Name> = [0] extends [1 & Name]
330330
? DefaultRenderer
331-
: [Name] extends [Marko.Template]
331+
: [Name] extends [Marko.Template<any, any>]
332332
? TemplateRenderer<Name>
333333
: [Name] extends [string]
334334
? NativeTagRenderer<Name>

packages/language-tools/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"dependencies": {
1010
"@babel/parser": "^7.28.0",
1111
"@luxass/strip-json-comments": "^1.4.0",
12-
"htmljs-parser": "^5.5.4",
12+
"htmljs-parser": "^5.6.1",
1313
"relative-import-path": "^1.0.0"
1414
},
1515
"devDependencies": {

packages/language-tools/src/extractors/script/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -378,20 +378,24 @@ function ${templateName}() {\n`);
378378
const internalInput = varLocal("input");
379379
const internalInputWithExtends = `${internalInput} extends unknown`;
380380
const internalApply = varLocal("apply");
381+
const returnTypeStr = didReturn
382+
? `typeof ${
383+
templateName + typeArgsStr
384+
} extends () => infer Return ? Return : never`
385+
: "void";
381386
const renderAndReturn = `(input: Marko.Directives & Input${typeArgsStr} & ${varShared(
382387
"Relate",
383388
)}<${internalInput}, Marko.Directives & Input${typeArgsStr}>) => (${varShared(
384389
"ReturnWithScope",
385-
)}<${internalInput}, ${
386-
didReturn
387-
? `typeof ${
388-
templateName + typeArgsStr
389-
} extends () => infer Return ? Return : never`
390-
: "void"
391-
}>)`;
390+
)}<${internalInput}, ${returnTypeStr}>)`;
392391
const templateOverrideClass = `${templateBaseClass}<{${
393392
this.#runtimeTypes
394-
? getRuntimeOverrides(this.#runtimeTypes, typeParamsStr, typeArgsStr)
393+
? getRuntimeOverrides(
394+
this.#runtimeTypes,
395+
typeParamsStr,
396+
typeArgsStr,
397+
returnTypeStr,
398+
)
395399
: ""
396400
}
397401
${this.#api ? `api: "${this.#api}",` : ""}

packages/language-tools/src/extractors/script/util/runtime-overrides.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
const RuntimeOverloads = new Map<string, (string | Replacement)[]>();
22
const commentsReg = /\/\*(?:[^*]|\*[^/])*\*\//gm;
33
const replaceTokensReg =
4-
/\babstract\s+(\w+)|Marko\.(TemplateInput(?:<[^>]+>)?|Component)/gm;
4+
/\babstract\s+(\w+)|Marko\.(TemplateInput(?:<[^>]+>)?|Component)|\b(Return)\b/gm;
55
const overrideBlockReg =
66
/\/\*[*\s]*@marko-overload-start[*\s]*\*\/([\s\S]+)\/\*[*\s]*@marko-overload-end[*\s]*\*\//g;
77

88
enum Replacement {
99
Generics,
1010
Input,
11+
Return,
1112
Component,
1213
}
1314

1415
export function getRuntimeOverrides(
1516
runtimeTypes: string,
1617
generics: string,
1718
applyGenerics: string,
19+
returnType: string,
1820
) {
1921
let overloads = RuntimeOverloads.get(runtimeTypes);
2022

@@ -29,12 +31,14 @@ export function getRuntimeOverrides(
2931
content = content.replace(commentsReg, ""); // remove all comments within the overloads.
3032

3133
while ((replaceMatch = replaceTokensReg.exec(content))) {
32-
const [, methodName, propertyName] = replaceMatch;
34+
const [, methodName, propertyName, returnName] = replaceMatch;
3335
const curText = content.slice(lastIndex, replaceMatch.index);
3436
lastIndex = replaceTokensReg.lastIndex;
3537

3638
if (methodName) {
3739
overloads.push(curText + methodName, Replacement.Generics);
40+
} else if (returnName) {
41+
overloads.push(curText, Replacement.Return);
3842
} else {
3943
overloads.push(
4044
curText,
@@ -61,6 +65,9 @@ export function getRuntimeOverrides(
6165
case Replacement.Input:
6266
result += appliedInput;
6367
break;
68+
case Replacement.Return:
69+
result += returnType;
70+
break;
6471
case Replacement.Component:
6572
result += appliedComponent;
6673
break;

packages/type-check/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"dependencies": {
77
"@babel/code-frame": "^7.27.1",
88
"@luxass/strip-json-comments": "^1.4.0",
9-
"@marko/language-tools": "^2.5.24",
9+
"@marko/language-tools": "^2.5.25",
1010
"arg": "^5.0.2",
1111
"kleur": "^4.1.5",
1212
"typescript": "^5.8.3"

0 commit comments

Comments
 (0)