npm NuGet v1.0.0 MIT
@metaengine/protobuf-angular
Protobuf 3 → Angular gRPC-Web services and message types with inject() DI, interceptors, and gRPC-native error handling. Idiomatic Angular 19+ over the Connect protocol.
Install
Pick your registry
The same generator, published to every ecosystem we support. Install however your project expects.
npmPrimary@metaengine/protobuf-angular
$npm install @metaengine/protobuf-angular
v1.0.0
NuGetMetaEngine.TypeScript.Protobuf.Angular
$dotnet add package MetaEngine.TypeScript.Protobuf.Angular
v1.0.0
Usage
Drive it from the CLI or programmatically
npm ships a zero-config CLI. NuGet ships the same generator as a C# fluent API — same options, same output.
npm · npx · CI-friendly
After install, point the CLI at your OpenAPI spec. It writes the generated tree to your chosen output directory.
Basic syntax
npx @metaengine/protobuf-angular <input> <output> [options]Generates Angular gRPC-Web services and message types from Protobuf 3 .proto files.
Quick examples
Generate from a .proto file
npx @metaengine/protobuf-angular service.proto ./src/app/apiWith Angular best practices
npx @metaengine/protobuf-angular service.proto ./src/app/api \
--provided-in root \
--inject-function \
--error-handling \
--documentationProduction setup with auth and timeout
npx @metaengine/protobuf-angular service.proto ./src/app/api \
--bearer-auth API_TOKEN \
--timeout 30 \
--error-handlingCLI options
Option
Description
--provided-in <value>
Angular injection scope (root, any, platform)
--base-url-token <name>
Injection token name for base URL [default: BASE_URL]
--service-suffix <suffix>
Service naming suffix [default: Service]
--options-threshold <n>
Parameter count to use options object [default: 4]
--documentation
Generate JSDoc comments
--inject-function
Use inject() instead of constructor injection (Angular 14+)
--error-handling
Enable gRPC-native error handling keyed on gRPC status codes
--bearer-auth <env-var-name>
Bearer token via DI injection token (e.g. API_TOKEN). Generates an Angular auth interceptor.
--basic-auth <userEnv:passEnv>
Basic auth from env vars. Format: <username-env>:<password-env> (e.g. API_USER:API_PASS). Generates an Angular auth interceptor.
--timeout <seconds>
Request timeout in seconds, emitted as a grpc-timeout header on every call
--custom-header <header-name>
Declare a static header for runtime population. Repeatable (e.g. X-Tenant-ID). Rendered as an empty header slot — Angular has no env-var access in the browser.
--date-transformation
Convert google.protobuf.Timestamp fields in responses to JavaScript Date objects
--types-barrel
Emit an index.ts barrel per folder plus a root index.ts re-exporting everything
--type-mapping <mapping>
Override TS type for a protobuf type. Repeatable. Targets: string · number · Date · boolean (e.g. google.protobuf.Timestamp=string)
--clean
Clean output directory (remove files not in generation)
--verbose
Enable verbose logging
--help, -h
Show help message
Options reference
Every knob, documented
Every option is available on the C# fluent API as a method, and most are also exposed as CLI flags. Cross-cutting auth, headers, retries and timeouts apply across frameworks.
Angular Options
5WithBaseUrlToken(string)Injection token name for base URL (default: "BASE_URL")WithInjectFunction()Use inject() instead of constructor DI (Angular 14+)WithProvidedIn(string)Injection scope ("root", "platform", "any")WithInterceptors()Generate interceptor infrastructure (ApiMiddleware type + provideApiInterceptors factory) so auth / headers live in interceptorsWithResponseDateTransformation()Convert google.protobuf.Timestamp fields in responses to Date objects
Auth · Headers · Resilience
9WithErrorHandling()Enable gRPC-native error handling keyed on gRPC status codes (NOT_FOUND / PERMISSION_DENIED → null · INVALID_ARGUMENT / FAILED_PRECONDITION → error body · UNAUTHENTICATED / INTERNAL / UNAVAILABLE → throw)WithErrorHandling(grpc => grpc...)Tune the gRPC taxonomy: ReturnNullForCodes(...) · ReturnErrorForCodes(...) · ThrowForCodes(...) · MapGrpcCode(code, behavior). Overrides merge on top of the defaultsWithBearerAuth()Bearer token from env var (default API_TOKEN) — adds Authorization headerWithBearerAuth(string)Bearer token from a specific env var nameWithBearerAuth(string, string)Bearer token with custom header nameWithBasicAuth(string, string)HTTP Basic auth from username + password env varsWithCustomHeader(string, string)Static header from env var. Repeatable (e.g. X-Tenant-ID ← TENANT_ID)WithTimeout(double)Request timeout in seconds, emitted as a grpc-timeout header on every callWithTimeout(double?, double?, double?, double?)Granular timeout: connect · read · write · pool
Protobuf Options
5WithDocumentation()Generate JSDoc comments from .proto field and service descriptionsWithTypeFilter(Func)Filter extracted proto types before registration — only types returning true are generatedWithTypeMapping(string, Type)Override the TS mapping for a protobuf well-known type by fully-qualified name (e.g. google.protobuf.Timestamp → string)WithMethodNames(Func)Custom method naming ruleWithOptionsObjectThreshold(int)Parameter count for options object (default: 4)
TypeScript Output
1WithTypesBarrel()Emit an index.ts barrel per folder plus a root index.ts re-exporting everything
Naming Transformations
3Types(Func)Transform type namesPaths(Func)Transform output pathsFileNames(Func)Transform file names
File Management
5CleanDestination()Clean output directory before generationAlwaysOverwrite()Always overwrite existing filesOnlyWhenModelChanged()Update only when model changesOnlyWhenNew()Write only new files, preserve existingCleanDirectories(...)Clean specific subdirectories
Diagnostics
1EnableVerboseLogging()Enable detailed logging
Features
Why this package is different
Deterministic output
Same spec + same options produce byte-identical files. Safe to commit, safe to diff in review, safe to cache in CI.
Tree-shakeable
One file per tag (or per operation) means bundlers drop unused code at build time. No runtime dispatch table.
Zero runtime
Validation and clients opt in. The default emit is pure types with no dependency surface beyond your HTTP lib.
Flexible naming
Case conventions configurable per role — types, properties, operations, enums. Idiomatic in the target by default.
Type resolution
Discriminated unions for oneOf, proper nullability, bigint when the spec mandates it, refs flattened only when safe.
Semver-honest
Spec diff drives the version bump. Additive changes = minor, removed ops = major. Never a surprise in your lockfile.