
Security News
ESLint Adds Official Support for Linting HTML
ESLint now supports HTML linting with 48 new rules, expanding its language plugin system to cover more of the modern web development stack.
ts-protoc-gen
Advanced tools
Protoc Plugin for generating TypeScript Declarations
This repository contains a protoc plugin that generates TypeScript declarations
(.d.ts
files) that match the JavaScript output of protoc --js_out=import_style=commonjs,binary
. This plugin can
also output service definitions as both .js
and .d.ts
files in the structure required by grpc-web, and as .d.ts
files in the structure required by grpc-node.
This plugin is tested and written using TypeScript 2.7.
As a prerequisite, download or install protoc
(the protocol buffer compiler) for your platform from the github releases page or via a package manager (ie: brew, apt).
For the latest stable version of the ts-protoc-gen plugin:
npm install ts-protoc-gen
For our latest build straight from master:
npm install ts-protoc-gen@next
The bazel rules have been moved to a separate project here. There is a migration guide for existing users.
Contributions are welcome! Please refer to CONTRIBUTING.md for more information.
As mentioned above, this plugin for protoc
serves two purposes:
By default, protoc will generate ES5 code when the --js_out
flag is used (see javascript compiler documentation). You have the choice of two module syntaxes, CommonJS or closure. This plugin (ts-protoc-gen
) can be used to generate Typescript definition files (.d.ts
) to provide type hints for CommonJS modules only.
To generate TypeScript definitions you must first configure protoc
to use this plugin and then specify where you want the TypeScript definitions to be written to using the --ts_out
flag.
# Path to this plugin
PROTOC_GEN_TS_PATH="./node_modules/.bin/protoc-gen-ts"
# Directory to write generated code to (.js and .d.ts files)
OUT_DIR="./generated"
protoc \
--plugin="protoc-gen-ts=${PROTOC_GEN_TS_PATH}" \
--js_out="import_style=commonjs,binary:${OUT_DIR}" \
--ts_out="${OUT_DIR}" \
users.proto base.proto
In the above example, the generated
folder will contain both .js
and .d.ts
files which you can reference in your TypeScript project to get full type completion and make use of ES6-style import statements, eg:
import { MyMessage } from "../generated/users_pb";
const msg = new MyMessage();
msg.setName("John Doe");
gRPC is a framework that enables client and server applications to communicate transparently, and makes it easier to build connected systems.
grpc-web is a comparability layer on both the server and client-side which allows gRPC to function natively in modern web-browsers.
To generate client-side service stubs from your protobuf files you must configure ts-protoc-gen to emit service definitions by passing the service=grpc-web
param to the --ts_out
flag, eg:
# Path to this plugin, Note this must be an abolsute path on Windows (see #15)
PROTOC_GEN_TS_PATH="./node_modules/.bin/protoc-gen-ts"
# Directory to write generated code to (.js and .d.ts files)
OUT_DIR="./generated"
protoc \
--plugin="protoc-gen-ts=${PROTOC_GEN_TS_PATH}" \
--js_out="import_style=commonjs,binary:${OUT_DIR}" \
--ts_out="service=grpc-web:${OUT_DIR}" \
users.proto base.proto
The generated
folder will now contain both pb_service.js
and pb_service.d.ts
files which you can reference in your TypeScript project to make RPCs.
Note Note that these modules require a CommonJS environment. If you intend to consume these stubs in a browser environment you will need to use a module bundler such as webpack.
Note Both js
and d.ts
service files will be generated regardless of whether there are service definitions in the proto files.
import {
UserServiceClient,
GetUserRequest
} from "../generated/users_pb_service";
const client = new UserServiceClient("https://my.grpc/server");
const req = new GetUserRequest();
req.setUsername("johndoe");
client.getUser(req, (err, user) => {
/* ... */
});
This plugin can generate .d.ts
files for gRPC service definitions as required by grpc-node.
To generate these declaration files from your protobuf files you must configure ts-protoc-gen to emit service definitions by passing the service=grpc-node
param to the --ts_out
flag, eg:
# Path to this plugin, Note this must be an abolsute path on Windows (see #15)
PROTOC_GEN_TS_PATH="./node_modules/.bin/protoc-gen-ts"
# Path to the grpc_node_plugin
PROTOC_GEN_GRPC_PATH="./node_modules/.bin/grpc_tools_node_protoc_plugin"
# Directory to write generated code to (.js and .d.ts files)
OUT_DIR="./generated"
protoc \
--plugin="protoc-gen-ts=${PROTOC_GEN_TS_PATH}" \
--plugin=protoc-gen-grpc=${PROTOC_GEN_GRPC_PATH} \
--js_out="import_style=commonjs,binary:${OUT_DIR}" \
--ts_out="service=grpc-node:${OUT_DIR}" \
--grpc_out="${OUT_DIR}" \
users.proto base.proto
The generated
folder will now contain both _grpc_pb.js
and _grpc_pb.d.ts
files which you can reference in your TypeScript project to make RPCs.
Note This plugin does not generate the _grpc_pb.js
files itself; those are generated by the protoc-gen-grpc plugin. This plugin only generates the _grpc_pb.d.ts
files.
@grpc/grpc-js
instead of grpc
Add a mode parameter to generate files that import @grpc/grpc-js
instead of grpc
, for example:
--ts_out="service=grpc-node,mode=grpc-js:${OUT_DIR}"
You'll also need to specify the grpc_js
option within the --grpc_out
flag, for example:
--grpc_out="grpc_js:${OUT_DIR}"
If you're consuming the server interface types you'll need to use version @grpc/grpc-js@1.2.0
or higher.
ts-protoc-gen
.By default the google-protobuf library will use the JavaScript number type to store 64bit float and integer values; this can lead to overflow problems as you exceed JavaScript's Number.MAX_VALUE
. To work around this, you should consider using the jstype
annotation on any 64bit fields, ie:
message Example {
uint64 bigInt = 1 [jstype = JS_STRING];
}
0.15.0
FAQs
Protoc Plugin for TypeScript Declarations and Service Definitions
The npm package ts-protoc-gen receives a total of 114,356 weekly downloads. As such, ts-protoc-gen popularity was classified as popular.
We found that ts-protoc-gen demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
ESLint now supports HTML linting with 48 new rules, expanding its language plugin system to cover more of the modern web development stack.
Security News
CISA is discontinuing official RSS support for KEV and cybersecurity alerts, shifting updates to email and social media, disrupting automation workflows.
Security News
The MCP community is launching an official registry to standardize AI tool discovery and let agents dynamically find and install MCP servers.