From f32259f49e9e90a14ba1ea3c1f5e440130d1f374 Mon Sep 17 00:00:00 2001 From: Alex Guerrieri Date: Sat, 21 Mar 2026 08:26:45 +0100 Subject: [PATCH 1/2] Add type alias support to TypeScript code generation Generates `export type AliasName = TSType` for alias types defined in RIDL. Aliases used as field or argument types are rendered by name. --- _examples/node-ts/server/server.gen.ts | 22 ++++++++++++++++++---- _examples/node-ts/service.ridl | 4 ++++ _examples/node-ts/webapp/client.gen.ts | 12 ++++++++---- types.go.tmpl | 4 ++++ 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/_examples/node-ts/server/server.gen.ts b/_examples/node-ts/server/server.gen.ts index 9d703ea..ed8d886 100644 --- a/_examples/node-ts/server/server.gen.ts +++ b/_examples/node-ts/server/server.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ -// node-ts v1.0.0 83e44adec2381759b0925cfad2f5e25da97ad163 +// node-ts v1.0.0 305dd11845b5c89bc81db898e446009c1d713c4c // -- -// Code generated by Webrpc-gen@v0.36.0 with ../../../gen-typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.25.0-1-g51a7ad2 with ../../../gen-typescript generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../../gen-typescript -server -out=./server/server.gen.ts @@ -12,7 +12,7 @@ export const WebrpcVersion = "v1" export const WebrpcSchemaVersion = "v1.0.0" // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = "83e44adec2381759b0925cfad2f5e25da97ad163" +export const WebrpcSchemaHash = "305dd11845b5c89bc81db898e446009c1d713c4c" // @@ -29,6 +29,10 @@ export interface ExampleServer { // Schema types // +export type Username = string + +export type Age = number + export enum Kind { USER = 'USER', ADMIN = 'ADMIN' @@ -160,6 +164,14 @@ const JS_TYPES = [ "undefined" ] +const validateUsername = (value: any) => { + return true +} + +const validateAge = (value: any) => { + return true +} + const validateKind = (value: any) => { if (!("USER" in value) || !validateType(value["USER"], "number")) { return false @@ -217,6 +229,8 @@ const validateGetArticleResponse = (value: any) => { } const TYPE_VALIDATORS: { [type: string]: (value: any) => boolean } = { + Username: validateUsername, + Age: validateAge, Kind: validateKind, User: validateUser, Page: validatePage, @@ -555,7 +569,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.36.0;gen-typescript@unknown;node-ts@v1.0.0" +export const WebrpcHeaderValue = "webrpc@v0.25.0-1-g51a7ad2;gen-typescript@unknown;node-ts@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string; diff --git a/_examples/node-ts/service.ridl b/_examples/node-ts/service.ridl index 0bf7d7e..330d8c8 100644 --- a/_examples/node-ts/service.ridl +++ b/_examples/node-ts/service.ridl @@ -14,6 +14,10 @@ service Example # Get article by id. - GetArticle(GetArticleRequest) => (GetArticleResponse) +type Username: string + +type Age: uint32 + enum Kind: uint32 - USER - ADMIN diff --git a/_examples/node-ts/webapp/client.gen.ts b/_examples/node-ts/webapp/client.gen.ts index 2192397..d91f461 100644 --- a/_examples/node-ts/webapp/client.gen.ts +++ b/_examples/node-ts/webapp/client.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ -// node-ts v1.0.0 83e44adec2381759b0925cfad2f5e25da97ad163 +// node-ts v1.0.0 305dd11845b5c89bc81db898e446009c1d713c4c // -- -// Code generated by Webrpc-gen@v0.36.0 with ../../../gen-typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen@v0.25.0-1-g51a7ad2 with ../../../gen-typescript generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../../gen-typescript -client -out=./webapp/client.gen.ts @@ -12,7 +12,7 @@ export const WebrpcVersion = "v1" export const WebrpcSchemaVersion = "v1.0.0" // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = "83e44adec2381759b0925cfad2f5e25da97ad163" +export const WebrpcSchemaHash = "305dd11845b5c89bc81db898e446009c1d713c4c" // // Client interface @@ -40,6 +40,10 @@ export interface ExampleClient { // Schema types // +export type Username = string + +export type Age = number + export enum Kind { USER = 'USER', ADMIN = 'ADMIN' @@ -496,7 +500,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.36.0;gen-typescript@unknown;node-ts@v1.0.0" +export const WebrpcHeaderValue = "webrpc@v0.25.0-1-g51a7ad2;gen-typescript@unknown;node-ts@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string; diff --git a/types.go.tmpl b/types.go.tmpl index aeb3a53..33a5054 100644 --- a/types.go.tmpl +++ b/types.go.tmpl @@ -24,6 +24,10 @@ export enum {{$type.Name}} { } {{end -}} +{{- if isAliasType $type }} +export type {{$type.Name}} = {{template "type" dict "Type" $type.Type "TypeMap" $typeMap}} +{{end -}} + {{- if isStructType $type }} export interface {{$type.Name}} { {{- range $_, $field := $type.Fields}} From 74d5c6a26068a79ac1dcf52f9dc91f29b4aaad0a Mon Sep 17 00:00:00 2001 From: Alex Guerrieri Date: Sat, 21 Mar 2026 09:16:40 +0100 Subject: [PATCH 2/2] regenerate examples and strip webrpc-gen version Update CI to use feat/type-alias branch of webrpc for alias support. Add version stripping to examples Makefile to avoid git conflicts. --- .github/workflows/ci.yml | 2 +- _examples/Makefile | 5 +++++ .../node-ts/server-fastify/server.gen.ts | 22 +++++++++++++++---- _examples/node-ts/server-hono/server.gen.ts | 22 +++++++++++++++---- _examples/node-ts/server/server.gen.ts | 4 ++-- _examples/node-ts/webapp/client.gen.ts | 4 ++-- _examples/sse/webapp/client.gen.ts | 4 ++-- 7 files changed, 48 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d982c8..5c8496a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -20,7 +20,7 @@ jobs: go-version: "1.23" - name: Install webrpc-gen (development) - run: git clone --single-branch https://github.com/webrpc/webrpc.git --branch master && cd webrpc && make install + run: git clone --single-branch https://github.com/webrpc/webrpc.git --branch feat/type-alias && cd webrpc && make install - name: Regenerate examples run: cd _examples && make generate diff --git a/_examples/Makefile b/_examples/Makefile index c79df7d..0c30f55 100644 --- a/_examples/Makefile +++ b/_examples/Makefile @@ -5,6 +5,11 @@ all: generate diff generate: cd node-ts && make generate cd sse && make generate + # Strip webrpc-gen version from generated files to avoid git conflicts. + @VERSION=$$(webrpc-gen --version | awk '{print $$2}'); \ + if [ -n "$$VERSION" ] && [ "$$VERSION" != "unknown" ]; then \ + git grep -l "$$VERSION" -- '*.ts' | xargs sed -i "s/@$$VERSION//g"; \ + fi diff: git diff --color --ignore-all-space --ignore-blank-lines --exit-code . diff --git a/_examples/node-ts/server-fastify/server.gen.ts b/_examples/node-ts/server-fastify/server.gen.ts index ed04dba..12df506 100644 --- a/_examples/node-ts/server-fastify/server.gen.ts +++ b/_examples/node-ts/server-fastify/server.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ -// node-ts v1.0.0 83e44adec2381759b0925cfad2f5e25da97ad163 +// node-ts v1.0.0 305dd11845b5c89bc81db898e446009c1d713c4c // -- -// Code generated by Webrpc-gen@v0.36.0 with ../../../gen-typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen with ../../../gen-typescript generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../../gen-typescript -server -out=./server-fastify/server.gen.ts @@ -12,7 +12,7 @@ export const WebrpcVersion = "v1" export const WebrpcSchemaVersion = "v1.0.0" // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = "83e44adec2381759b0925cfad2f5e25da97ad163" +export const WebrpcSchemaHash = "305dd11845b5c89bc81db898e446009c1d713c4c" // @@ -29,6 +29,10 @@ export interface ExampleServer { // Schema types // +export type Username = string + +export type Age = number + export enum Kind { USER = 'USER', ADMIN = 'ADMIN' @@ -160,6 +164,14 @@ const JS_TYPES = [ "undefined" ] +const validateUsername = (value: any) => { + return true +} + +const validateAge = (value: any) => { + return true +} + const validateKind = (value: any) => { if (!("USER" in value) || !validateType(value["USER"], "number")) { return false @@ -217,6 +229,8 @@ const validateGetArticleResponse = (value: any) => { } const TYPE_VALIDATORS: { [type: string]: (value: any) => boolean } = { + Username: validateUsername, + Age: validateAge, Kind: validateKind, User: validateUser, Page: validatePage, @@ -555,7 +569,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.36.0;gen-typescript@unknown;node-ts@v1.0.0" +export const WebrpcHeaderValue = "webrpc;gen-typescript@unknown;node-ts@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string; diff --git a/_examples/node-ts/server-hono/server.gen.ts b/_examples/node-ts/server-hono/server.gen.ts index af83320..9bb97c0 100644 --- a/_examples/node-ts/server-hono/server.gen.ts +++ b/_examples/node-ts/server-hono/server.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ -// node-ts v1.0.0 83e44adec2381759b0925cfad2f5e25da97ad163 +// node-ts v1.0.0 305dd11845b5c89bc81db898e446009c1d713c4c // -- -// Code generated by Webrpc-gen@v0.36.0 with ../../../gen-typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen with ../../../gen-typescript generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../../gen-typescript -server -out=./server-hono/server.gen.ts @@ -12,7 +12,7 @@ export const WebrpcVersion = "v1" export const WebrpcSchemaVersion = "v1.0.0" // Schema hash generated from your RIDL schema -export const WebrpcSchemaHash = "83e44adec2381759b0925cfad2f5e25da97ad163" +export const WebrpcSchemaHash = "305dd11845b5c89bc81db898e446009c1d713c4c" // @@ -29,6 +29,10 @@ export interface ExampleServer { // Schema types // +export type Username = string + +export type Age = number + export enum Kind { USER = 'USER', ADMIN = 'ADMIN' @@ -160,6 +164,14 @@ const JS_TYPES = [ "undefined" ] +const validateUsername = (value: any) => { + return true +} + +const validateAge = (value: any) => { + return true +} + const validateKind = (value: any) => { if (!("USER" in value) || !validateType(value["USER"], "number")) { return false @@ -217,6 +229,8 @@ const validateGetArticleResponse = (value: any) => { } const TYPE_VALIDATORS: { [type: string]: (value: any) => boolean } = { + Username: validateUsername, + Age: validateAge, Kind: validateKind, User: validateUser, Page: validatePage, @@ -555,7 +569,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.36.0;gen-typescript@unknown;node-ts@v1.0.0" +export const WebrpcHeaderValue = "webrpc;gen-typescript@unknown;node-ts@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string; diff --git a/_examples/node-ts/server/server.gen.ts b/_examples/node-ts/server/server.gen.ts index ed8d886..303138c 100644 --- a/_examples/node-ts/server/server.gen.ts +++ b/_examples/node-ts/server/server.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ // node-ts v1.0.0 305dd11845b5c89bc81db898e446009c1d713c4c // -- -// Code generated by Webrpc-gen@v0.25.0-1-g51a7ad2 with ../../../gen-typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen with ../../../gen-typescript generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../../gen-typescript -server -out=./server/server.gen.ts @@ -569,7 +569,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.25.0-1-g51a7ad2;gen-typescript@unknown;node-ts@v1.0.0" +export const WebrpcHeaderValue = "webrpc;gen-typescript@unknown;node-ts@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string; diff --git a/_examples/node-ts/webapp/client.gen.ts b/_examples/node-ts/webapp/client.gen.ts index d91f461..035e0d5 100644 --- a/_examples/node-ts/webapp/client.gen.ts +++ b/_examples/node-ts/webapp/client.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ // node-ts v1.0.0 305dd11845b5c89bc81db898e446009c1d713c4c // -- -// Code generated by Webrpc-gen@v0.25.0-1-g51a7ad2 with ../../../gen-typescript generator. DO NOT EDIT. +// Code generated by Webrpc-gen with ../../../gen-typescript generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../../gen-typescript -client -out=./webapp/client.gen.ts @@ -500,7 +500,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.25.0-1-g51a7ad2;gen-typescript@unknown;node-ts@v1.0.0" +export const WebrpcHeaderValue = "webrpc;gen-typescript@unknown;node-ts@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string; diff --git a/_examples/sse/webapp/client.gen.ts b/_examples/sse/webapp/client.gen.ts index 493f6b4..52bcfba 100644 --- a/_examples/sse/webapp/client.gen.ts +++ b/_examples/sse/webapp/client.gen.ts @@ -1,7 +1,7 @@ /* eslint-disable */ // webrpc-sse-chat v1.0.0 8b6b6e0df6c23832e31534594d32955c3383689b // -- -// Code generated by Webrpc-gen@v0.36.0 with ../../ generator. DO NOT EDIT. +// Code generated by Webrpc-gen with ../../ generator. DO NOT EDIT. // // webrpc-gen -schema=service.ridl -target=../../ -client -out=./webapp/client.gen.ts @@ -565,7 +565,7 @@ export const webrpcErrorByCode: { [code: number]: any } = { export const WebrpcHeader = "Webrpc" -export const WebrpcHeaderValue = "webrpc@v0.36.0;@unknown;webrpc-sse-chat@v1.0.0" +export const WebrpcHeaderValue = "webrpc;@unknown;webrpc-sse-chat@v1.0.0" type WebrpcGenVersions = { WebrpcGenVersion: string;