@typespec-tools/emitter-express
v0.3.0
Published
TypeSpec library for emitting a helper function to build type-safe Express routes a [TypeSpec](https://typespec.io) DSL using the [@typespec/http](https://typespec.io/docs/libraries/http/reference) library.
Downloads
4
Readme
@typespec-tools/emitter-express
TypeSpec library for emitting a helper function to build type-safe Express routes a TypeSpec DSL using the @typespec/http library.
[!WARNING] This library uses the current emitter-framework that is set to be updated, which could cause breaking changes.
Disclaimer: Please note that this library is not officially affiliated with TypeSpec or Azure. It is an independent project started by @codingmatty.
Features / Roadmap
- [x] Emit a function that can build type-safe Express routes
- [ ] Add support for typed responses based on status codes
- [ ] Add support for authorization
- [ ] Add support for header types
- [ ] Add support for Zod schema validation of inputs: Path, Query, Body.
- [ ] Add support for Zod schema validation of output body
Install
npm install @typespec-tools/emitter-express
Emitter
Usage
- Via the command line
tsp compile . --emit=@typespec-tools/emitter-express
- Via the config
emit:
- "@typespec-tools/emitter-express"
The config can be extended with options as follows:
emit:
- "@typespec-tools/emitter-express"
options:
"@typespec-tools/emitter-express":
option: value
Examples
Given the following Typespec:
import "@typespec/http";
enum petType {...}
model Pet {...}
@route("/pets")
namespace Pets {
@get
op listPets(@query type?: petType): {
@body pets: Pet[];
};
}
This emitter will allow you to implement the following:
import { createTypedRouter } from 'tsp-output/@typespec-tools/emitter-express/output";
const app = express();
const router = express.Router();
typedRouter = createTypedRouter(router);
typedRouter.Pets.listPets((req, res) => {
// req.query.type is typed as petType enum
// the response has type: { pets: Pet[] }
res.json({ pets: [...] });
});
app.use(typedRouter.router);
Alternatively, you can implement a single namespace:
import { createPetsRouter } from 'tsp-output/@typespec-tools/emitter-express/output";
export const router = express.Router();
typedPetsRouter = createPetsRouter(router);
typedPetsRouter.listPets((req, res) => {
// req.query.type is typed as petType enum
// the response has type: { pets: Pet[] }
res.json({ pets: [...] });
});
Emitter options
| Option | Type | Default | Description |
| ------------- | ------ | ----------- | ----------------------- |
| output-file
| string | "output.ts" | Name of the output file |