Skip to content
Merged
Show file tree
Hide file tree
Changes from 22 commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
1312b6b
Adjusting trigger braches.
RobinTail Dec 27, 2025
c6becdc
Merge branch 'master' into make-v27
RobinTail Dec 27, 2025
22d0b72
Cleanup migration.
RobinTail Dec 27, 2025
d10ccc9
Preparing v27 initial beta for migration.
RobinTail Dec 27, 2025
4aa2c84
Chagelog: initial v27.
RobinTail Dec 27, 2025
3d369bb
Adjusting migration version in Readme and compat test.
RobinTail Dec 27, 2025
c6434fe
Async loading TypeScript by `Integration` (#3149)
RobinTail Dec 28, 2025
8735eb9
Adjusting compat test.
RobinTail Dec 28, 2025
153ec55
fix: handle empty object in costructor.
RobinTail Dec 28, 2025
b5ccb20
Fix compat test (lint).
RobinTail Dec 28, 2025
84051bc
Merge branch 'master' into make-v27
RobinTail Dec 29, 2025
24dfcd1
Merge branch 'master' into make-v27
RobinTail Dec 30, 2025
2397be6
Updating snapshot.
RobinTail Dec 30, 2025
a14a9fa
Merge branch 'master' into make-v27
RobinTail Dec 30, 2025
0ca06cd
Merge branch 'master' into make-v27
RobinTail Jan 1, 2026
611967d
Merge branch 'master' into make-v27
RobinTail Jan 2, 2026
9506dbc
feat(v27): Zod Plugin v4: Moving brand to inheritable metadata (#3162)
RobinTail Jan 2, 2026
f309d3e
Changelog: reflecting the new requirements in 27.0.0.
RobinTail Jan 2, 2026
0e2de73
express-zod-api version 27.0.0-beta.1
github-actions[bot] Jan 2, 2026
721bc8c
Remove x-brand override from vitest schemaSerializer (moved to plugin).
RobinTail Jan 2, 2026
5ef0809
v27 is for Nikki Kuhnhausen.
RobinTail Jan 2, 2026
c800565
Security: planning the release for February.
RobinTail Jan 2, 2026
ac0e3ea
Migration: add handling of async fn declarations, and more tests.
RobinTail Jan 2, 2026
5c9c0c5
Changelog: more details on typescript.
RobinTail Jan 3, 2026
60e71ae
Merge branch 'master' into make-v27
RobinTail Jan 6, 2026
8d1708e
Merge branch 'master' into make-v27
RobinTail Jan 11, 2026
f382c95
Merge branch 'master' into make-v27
RobinTail Jan 12, 2026
24f41be
Merge branch 'master' into make-v27
RobinTail Jan 15, 2026
bfba5d0
Merge branch 'master' into make-v27
RobinTail Jan 17, 2026
6c370d2
migration version 27.0.0-beta.1
github-actions[bot] Jan 17, 2026
e33ccd9
zod-plugin version 4.0.0-beta.2
github-actions[bot] Jan 17, 2026
6ee16c0
express-zod-api version 27.0.0-beta.2
github-actions[bot] Jan 17, 2026
c931a8b
Security: plan to deprecate v22.
RobinTail Jan 17, 2026
1d228f1
Merge branch 'master' into make-v27
RobinTail Jan 19, 2026
018886c
Merge branch 'master' into make-v27
RobinTail Jan 25, 2026
be2e22d
Merge branch 'master' into make-v27
RobinTail Jan 31, 2026
b2f5961
Merge branch 'master' into make-v27
RobinTail Feb 1, 2026
07b2bac
Merge branch 'master' into make-v27
RobinTail Feb 1, 2026
7ad55d0
rm tmp triggers
RobinTail Feb 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ name: "CodeQL"

on:
push:
branches: [ master, v22, v23, v24, v25 ]
branches: [ master, v23, v24, v25, v26, make-v27 ]
pull_request:
# The branches below must be a subset of the branches above
branches: [ master, v22, v23, v24, v25 ]
branches: [ master, v23, v24, v25, v26, make-v27 ]
schedule:
- cron: '26 8 * * 1'

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/node.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ name: Node.js CI

on:
push:
branches: [ master, v22, v23, v24, v25 ]
branches: [ master, v23, v24, v25, v26, make-v27 ]
pull_request:
branches: [ master, v22, v23, v24, v25 ]
branches: [ master, v23, v24, v25, v26, make-v27 ]

jobs:
build:
Expand Down
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,38 @@
# Changelog

## Version 27

### v27.0.0

- Supported `zod` versions: `^4.3.4`;
- The new version of Zod Plugin utilizes the inheritable metadata feature of Zod 4.3;
- Breaking change to the `Integration` class:
- Either import and assign the `typescript` property to constructor argument;
- Or use the new static async method `create()` to delegate the import;

```diff
/** Option 1: import and assign */
import { Integration } from "express-zod-api";
+ import typescript from "typescript";

const client = new Integration({
routing,
config,
+ typescript,
});
```

```diff
/** Option 2: delegate asynchronously */
import { Integration } from "express-zod-api";

- const client = new Integration({
+ const client = await Integration.create({
routing,
config,
});
```

## Version 26

### v26.3.0
Expand Down
8 changes: 5 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ Install the framework, its peer dependencies and type assistance packages using

```shell
# example for pnpm:
pnpm add express-zod-api express zod typescript http-errors
pnpm add express-zod-api express zod http-errors
pnpm add -D @types/express @types/node @types/http-errors
```

Expand Down Expand Up @@ -1075,13 +1075,15 @@ adding the runtime helpers the framework relies on.

## Generating a Frontend Client

You can generate a TypeScript file containing the IO types of your API and a client for it.
Consider installing `prettier` and using the async `printFormatted()` method.
You can generate a TypeScript file containing the IO types of your API and a client for it. Make sure you have
`typescript` installed. Consider also installing `prettier` and using the async `printFormatted()` method.

```ts
import typescript from "typescript";
import { Integration } from "express-zod-api";

const client = new Integration({
typescript, // or await Integration.create() to delegate importing
routing,
config,
variant: "client", // <— optional, see also "types" for a DIY solution
Expand Down
1 change: 1 addition & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

| Version | Code name | Release | Supported |
| ------: | :------------ | :------ | :----------------: |
| 27.x.x | Nikki | 02.2026 | :white_check_mark: |
| 26.x.x | Lia | 12.2025 | :white_check_mark: |
| 25.x.x | Sara | 08.2025 | :white_check_mark: |
| 24.x.x | Ashley | 06.2025 | :white_check_mark: |
Expand Down
2 changes: 1 addition & 1 deletion compat-test/eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ import migration from "@express-zod-api/migration";

export default [
{ languageOptions: { parser }, plugins: { migration } },
{ files: ["**/*.ts"], rules: { "migration/v26": "error" } },
{ files: ["**/*.ts"], rules: { "migration/v27": "error" } },
];
4 changes: 3 additions & 1 deletion compat-test/migration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { describe, test, expect } from "vitest";
describe("Migration", () => {
test("should fix the import", async () => {
const fixed = await readFile("./sample.ts", "utf-8");
expect(fixed).toBe(`const route = {\nget: someEndpoint,\n}\n`);
expect(fixed).toBe(
`import typescript from "typescript";\n\nnew Integration({ typescript, routing });\n`,
);
});
});
2 changes: 1 addition & 1 deletion compat-test/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"type": "module",
"private": true,
"scripts": {
"pretest": "echo 'const route = new DependsOnMethod({ get: someEndpoint })' > sample.ts",
"pretest": "echo 'new Integration({ routing });' > sample.ts",
"test": "eslint --fix && vitest --run",
"posttest": "rm sample.ts"
},
Expand Down
10 changes: 5 additions & 5 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ const tsFactoryConcerns = [
selector: "Identifier[name='createUnionTypeNode']",
message: "use makeUnion() helper",
},
{
selector: "Identifier[name='createIdentifier']",
message: "use makeId() helper",
},
];

export default tsPlugin.config(
Expand Down Expand Up @@ -238,11 +242,7 @@ export default tsPlugin.config(
files: ["migration/index.ts"],
rules: {
"allowed/dependencies": ["error", { packageDir: migrationDir }],
"no-restricted-syntax": [
"warn",
...importConcerns,
...performanceConcerns,
],
"no-restricted-syntax": ["warn", ...importConcerns],
},
},
{
Expand Down
2 changes: 2 additions & 0 deletions example/generate-client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { writeFile } from "node:fs/promises";
import { Integration } from "express-zod-api";
import { routing } from "./routing";
import { config } from "./config";
import typescript from "typescript";

await writeFile(
"example.client.ts",
await new Integration({
typescript,
routing,
config,
serverUrl: `http://localhost:${config.http!.listen}`,
Expand Down
5 changes: 4 additions & 1 deletion express-zod-api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "express-zod-api",
"version": "26.3.0",
"version": "27.0.0-beta.1",
"description": "A Typescript framework to help you get an API server up and running with I/O schema validation and custom middlewares in minutes.",
"license": "MIT",
"repository": {
Expand Down Expand Up @@ -78,6 +78,9 @@
},
"express-fileupload": {
"optional": true
},
"typescript": {
"optional": true
}
},
"devDependencies": {
Expand Down
Loading