From 82cf4e3a0b76809189e17aab2d8097ea66ed9b30 Mon Sep 17 00:00:00 2001 From: adelnizamutdinov Date: Tue, 25 Aug 2026 14:55:13 +0300 Subject: [PATCH] Avoid unnecessary TypeScript path conversions --- internal/tsemit/tsemit.go | 2 +- oasmith_test.go | 6 +++++ testdata/golden/private-typescript/api.ts | 31 +++++++++++------------ 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/internal/tsemit/tsemit.go b/internal/tsemit/tsemit.go index 1b0f1a5..21229d9 100644 --- a/internal/tsemit/tsemit.go +++ b/internal/tsemit/tsemit.go @@ -639,7 +639,7 @@ func pathExpression(path string, params []opParam) string { if param.Kind != "path" { continue } - expr = strings.ReplaceAll(expr, "{"+param.WireName+"}", "${encodeURIComponent(String(requestParameters['"+param.Name+"']))}") + expr = strings.ReplaceAll(expr, "{"+param.WireName+"}", "${encodeURIComponent(requestParameters['"+param.Name+"'])}") } if strings.Contains(expr, "${") { return "`" + expr + "`" diff --git a/oasmith_test.go b/oasmith_test.go index 3a2b884..5eb0daf 100644 --- a/oasmith_test.go +++ b/oasmith_test.go @@ -182,6 +182,12 @@ func TestTypeScriptClientQueries(t *testing.T) { if !strings.Contains(string(raw), "const queryParameters = new URLSearchParams()") { t.Fatal("generated TypeScript API does not use URLSearchParams") } + if !strings.Contains(string(raw), `encodeURIComponent(requestParameters["thingId"])`) { + t.Fatal("generated TypeScript API does not directly escape path parameters") + } + if strings.Contains(string(raw), "encodeURIComponent(String(") { + t.Fatal("generated TypeScript API unnecessarily converts path parameters") + } testPath := filepath.Join(outDir, "query.test.ts") if err := os.WriteFile(testPath, []byte(typescriptQueryBehaviorTest), 0o644); err != nil { t.Fatalf("write TypeScript query test: %v", err) diff --git a/testdata/golden/private-typescript/api.ts b/testdata/golden/private-typescript/api.ts index 36e68fe..dc3563b 100644 --- a/testdata/golden/private-typescript/api.ts +++ b/testdata/golden/private-typescript/api.ts @@ -1496,7 +1496,7 @@ export class DefaultApi { const headerParameters: Record = {} return new Request( this.baseURL + - `/session/pages/show/${encodeURIComponent(String(requestParameters["showId"]))}`, + `/session/pages/show/${encodeURIComponent(requestParameters["showId"])}`, { method: "GET", headers: headerParameters, @@ -1567,7 +1567,7 @@ export class DefaultApi { const headerParameters: Record = {} return new Request( this.baseURL + - `/session/pages/shows/${encodeURIComponent(String(requestParameters["teamId"]))}`, + `/session/pages/shows/${encodeURIComponent(requestParameters["teamId"])}`, { method: "GET", headers: headerParameters, @@ -1716,7 +1716,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/image-uploads/presign`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/image-uploads/presign`, { method: "POST", headers: headerParameters, @@ -1805,7 +1805,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/media-uploads/multipart`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/media-uploads/multipart`, { method: "POST", headers: headerParameters, @@ -1894,7 +1894,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/media-uploads/presign`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/media-uploads/presign`, { method: "POST", headers: headerParameters, @@ -1993,7 +1993,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/media-uploads/${encodeURIComponent(String(requestParameters["uploadSessionId"]))}/complete`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/media-uploads/${encodeURIComponent(requestParameters["uploadSessionId"])}/complete`, { method: "POST", headers: headerParameters, @@ -2093,7 +2093,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/media-uploads/${encodeURIComponent(String(requestParameters["uploadSessionId"]))}/parts/presign`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/media-uploads/${encodeURIComponent(requestParameters["uploadSessionId"])}/parts/presign`, { method: "POST", headers: headerParameters, @@ -2170,7 +2170,7 @@ export class DefaultApi { const headerParameters: Record = {} return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows`, { method: "GET", headers: headerParameters, @@ -2248,7 +2248,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows`, { method: "POST", headers: headerParameters, @@ -2349,7 +2349,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows/${encodeURIComponent(String(requestParameters["showId"]))}`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows/${encodeURIComponent(requestParameters["showId"])}`, { method: "PUT", headers: headerParameters, @@ -2432,7 +2432,7 @@ export class DefaultApi { const headerParameters: Record = {} return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows/${encodeURIComponent(String(requestParameters["showId"]))}/episodes`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows/${encodeURIComponent(requestParameters["showId"])}/episodes`, { method: "GET", headers: headerParameters, @@ -2524,7 +2524,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows/${encodeURIComponent(String(requestParameters["showId"]))}/episodes`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows/${encodeURIComponent(requestParameters["showId"])}/episodes`, { method: "POST", headers: headerParameters, @@ -2628,7 +2628,7 @@ export class DefaultApi { headerParameters["Content-Type"] = "application/json" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows/${encodeURIComponent(String(requestParameters["showId"]))}/episodes/${encodeURIComponent(String(requestParameters["episodeId"]))}`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows/${encodeURIComponent(requestParameters["showId"])}/episodes/${encodeURIComponent(requestParameters["episodeId"])}`, { method: "PUT", headers: headerParameters, @@ -2725,7 +2725,7 @@ export class DefaultApi { headerParameters["Accept"] = "text/event-stream" return new Request( this.baseURL + - `/session/teams/${encodeURIComponent(String(requestParameters["teamId"]))}/shows/${encodeURIComponent(String(requestParameters["showId"]))}/episodes/${encodeURIComponent(String(requestParameters["episodeId"]))}/episode-events`, + `/session/teams/${encodeURIComponent(requestParameters["teamId"])}/shows/${encodeURIComponent(requestParameters["showId"])}/episodes/${encodeURIComponent(requestParameters["episodeId"])}/episode-events`, { method: "GET", headers: headerParameters, @@ -2892,8 +2892,7 @@ export class DefaultApi { const headerParameters: Record = {} return new Request( - this.baseURL + - `/${encodeURIComponent(String(requestParameters["feedId"]))}.rss`, + this.baseURL + `/${encodeURIComponent(requestParameters["feedId"])}.rss`, { method: "GET", headers: headerParameters,