Skip to content

v27 is for Nikki Kuhnhausen#3148

Merged
RobinTail merged 39 commits into
masterfrom
make-v27
Feb 1, 2026
Merged

v27 is for Nikki Kuhnhausen#3148
RobinTail merged 39 commits into
masterfrom
make-v27

Conversation

@RobinTail
Copy link
Copy Markdown
Owner

@RobinTail RobinTail commented Dec 27, 2025

image

Nikki Kuhnhausen was 17 years young transgender woman. She was murdered by David Bogdanov in 2019. Her body was identified from decayed remains on December 7th, in the Larch Mountain area near Vancouver, Washington. Authorities were able to identify the body from personal effects; subsequent examination showed she died from strangulation. Nikki had previously been missing since June 5th when she left with David Bogdanov, a 25-year-old male she met in Snapchat, who has since been charged with second degree murder. Authorities believe that Bogdanov, looking for a sexual encounter, became enraged upon learning of Nikki's transgender origins.

https://katu.com/news/local/missing-vancouver-teen-nikki-kuhnhausen-found-dead-in-remote-clark-county-location-suspect-arrested

Transgender women suffer too frequently from transphobic violence and cruelty, being the less protected social group. I'd like to raise an awareness of this problem. Humans should be creators — not killers. But most importantly, I want every transgender girl to have an opportunity to create applications quickly and, in general, learn to write code easily in order to receive job offers and leave dangerously transphobic territories for more favorable and civilized ones, and live happily there. Protect transgender women.


Version 27 makes typescript an optional peer dependency with explicit injection of the manually imported module into the Integration class constructor (new Integration({ typescript, ... })), or by calling the new async Integration.create() factory method for automatic loading. The Zod Plugin now leverages Zod 4.3's inheritable metadata feature, removing the need for pack() and unpack() helpers while simplifying brand handling by storing brands in standard metadata under x-brand property.

Summary by CodeRabbit

  • New Features

    • Async Integration.create() factory and optional TypeScript injection for client generation
    • Zod metadata is inheritable (requires Zod ^4.3.4)
  • Breaking Changes

    • pack/unpack/setBrand removed; branding exposed as "x-brand" via schema.meta()
    • Integration constructor now accepts a typescript option and usage may require async create()
  • Documentation

    • Examples updated for TypeScript injection and async create() usage
  • Chores

    • Version bumps to v27 beta and updated CI branch targets

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Dec 27, 2025

📝 Walkthrough

Walkthrough

Injects a TypeScript runtime into Integration/TypescriptAPI, adds an async Integration.create(), refactors identifier handling to string/id helpers, makes Zod metadata inheritable (removes pack/unpack and moves brand to globalRegistry/x-brand), and updates workflows, docs, migration rules, tests, and package metadata for v27/v4.

Changes

Cohort / File(s) Summary
Workflows
\.github/workflows/codeql-analysis.yml, \.github/workflows/node.js.yml
Updated push/pull_request branch filters: removed v22, added v26 (and aligned branches for node/codeql workflows).
Packages & workspace
express-zod-api/package.json, migration/package.json, zod-plugin/package.json, pnpm-workspace.yaml
Bumped versions to v27/v4 betas; marked typescript and express-fileupload optional peers; raised zod peer constraint to ^4.3.4.
Integration API & examples
express-zod-api/src/integration.ts, example/generate-client.ts, example/*
Added optional typescript to IntegrationParams/constructor, thread TS into examples, and added static async create() factory for lazy TS loading.
IntegrationBase refactor
express-zod-api/src/integration-base.ts
Major refactor to accept (typescript, serverUrl), switch from ts.Identifier objects to string id map and make* helpers; id-centric codegen and renamed helpers.
TypescriptAPI internals
express-zod-api/src/typescript-api.ts, express-zod-api/tests/zts.spec.ts
TypescriptAPI now accepts injected ts; added makeId and updated helpers to accept/convert string ids and initId strings.
Program assembly & codegen
express-zod-api/src/integration.ts, express-zod-api/src/zts.ts
Program nodes now use makeSomeOfType(), makeMethodType(), makeRequestType(); enum literal mapping switched to R.map(api.makeLiteralType, ...).
Zod-plugin branding & runtime
zod-plugin/src/brand.ts, zod-plugin/src/meta.ts, zod-plugin/src/runtime.ts
Removed pack/unpack and setBrand; renamed brand key to "x-brand"; use globalRegistry for storage; added brandSetter wired to ZodType.brand.
Removed packer & exports
zod-plugin/src/packer.ts, zod-plugin/src/index.ts
Deleted packer.ts and removed pack/unpack re-exports from the plugin entry.
Migration rules simplified
migration/index.ts, migration/index.spec.ts, compat-test/migration.spec.ts, compat-test/package.json
Replaced multiple queries with a single integration object-expression query; rule now injects typescript prop or converts new Integration(...)await Integration.create(...) in async contexts; tests/samples updated.
Linting / compat configs
eslint.config.js, compat-test/eslint.config.js
Added tsFactoryConcerns rule for createIdentifier; removed performanceConcerns from migration no-restricted-syntax; migration target updated to v27.
Docs & changelogs
CHANGELOG.md, README.md, zod-plugin/CHANGELOG.md, zod-plugin/README.md, SECURITY.md, migration/README.md
Added v27/v4 changelogs and README updates documenting TypeScript injection, create() factory, Zod 4.3 inheritable metadata, and supported-version/security table updates.
Tests & test setup
express-zod-api/tests/integration.spec.ts, express-zod-api/tests/env.spec.ts, zod-plugin/tests/*, express-zod-api/vitest.setup.ts
Tests adapted to use await Integration.create(...) or pass typescript; added metadata inheritance test; removed pack/unpack tests; brand assertions moved to meta()/globalRegistry; vitest setup simplified.
Misc small changes
express-zod-api/src/startup-logo.ts, compat-test/*, example/*
Minor edits (startup dedication updated to "Nikki"; compat-test/sample updates; example clients wired to new TypeScript option).

Sequence Diagram(s)

sequenceDiagram
    participant Client as Client Code
    participant Integration as Integration
    participant Base as IntegrationBase
    participant TSAPI as TypescriptAPI
    participant TS as TypeScript Runtime

    rect rgba(240,248,255,0.5)
    Note over Client,Integration: New async Integration.create flow
    Client->>Integration: await Integration.create({ config, routing, serverUrl? })
    activate Integration
    Integration->>TS: load peer TypeScript (auto-load)
    activate TS
    TS-->>Integration: ts module
    Integration->>Base: super(ts, serverUrl)
    activate Base
    Base->>TSAPI: new TypescriptAPI(ts)
    activate TSAPI
    TSAPI->>TS: createIdentifier / build nodes
    TSAPI-->>Base: id helpers ready
    deactivate TSAPI
    Base-->>Integration: initialized
    deactivate Base
    Integration-->>Client: Integration instance
    deactivate Integration
    end

    rect rgba(255,240,245,0.5)
    Note over Client,Integration: Old synchronous constructor flow
    Client->>Integration: new Integration({ config, routing })
    Note over Integration: Synchronous path, no create() factory, no auto TS load
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~75 minutes

Possibly related PRs

Poem

🐰
I hopped through code and left a trail,
Types now injected, ids set to sail.
Metadata nests where carrots grow,
create() wakes up, ready to go.
Hooray — the garden's broader now.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the main focus of this release: version 27 is dedicated to Nikki Kuhnhausen, as reflected in the startup logo change and overall PR context.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch make-v27

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coveralls-official
Copy link
Copy Markdown

coveralls-official Bot commented Dec 27, 2025

Coverage Status

coverage: 100.0%. remained the same
when pulling b2f5961 on make-v27
into f4ebe77 on master.

@RobinTail RobinTail added the documentation Improvements or additions to documentation label Dec 27, 2025
The better implementation of #3139 using the dynamic `import()` instead
of `createRequire()`.

The new implementation requires either:
- to import and provide the `typescript` to `Integration::constructor()`
- or to use the new async method `Integration::create()`

This is a breaking change.

`typescript` becomes an optional peer dependency. Documentation adjusted
accordingly.

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **Documentation**
  * Updated README installation section to clarify TypeScript handling.
* Enhanced frontend client generation examples with explicit TypeScript
configuration instructions and usage patterns.

* **New Features**
* Added async factory method for integration setup, offering alternative
to direct instantiation.
* Made TypeScript an optional peer dependency instead of required,
reducing installation footprint.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
@RobinTail RobinTail added enhancement New feature or request dependencies Pull requests that update a dependency file breaking Backward incompatible changes refactoring The better way to achieve the same result and removed refactoring The better way to achieve the same result labels Dec 28, 2025
@RobinTail RobinTail added this to the v27 milestone Dec 28, 2025
RobinTail and others added 8 commits December 29, 2025 17:53
Thanks to #3156 storing the runtime distinguishable brand in the `bag`
is no longer required, since metadata became inheritable between zod
schemas in `globalRegistry` starting from Zod v4.3.0.

See https://github.com/colinhacks/zod/pull/5578/changes for
implementation.

Breaking changes to the Zod Plugin:
- min Zod version 4.3.4
- `pack()` and `unpack()` removed (no longer needed)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Metadata now inherits across chained schema operations and
constraints.

* **Breaking Changes**
  * Removed pack/unpack utilities; use schema.meta() for metadata.
* Brand metadata moved to a namespaced meta key ("x-brand"); retrieve
via schema.meta() or the getBrand() helper.

* **Chores**
  * Bumped Zod requirement to ^4.3.4 and plugin version to 4.0.0-beta.1.

<sub>✏️ Tip: You can customize this high-level summary in your review
settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
@RobinTail RobinTail added the coverage Additional tests label Jan 2, 2026
@RobinTail
Copy link
Copy Markdown
Owner Author

✅ QA passed

Comment thread SECURITY.md
Comment thread .github/workflows/codeql-analysis.yml Outdated
Comment thread .github/workflows/codeql-analysis.yml Outdated
Comment thread .github/workflows/node.js.yml Outdated
Comment thread .github/workflows/node.js.yml Outdated
Copy link
Copy Markdown
Owner Author

@RobinTail RobinTail left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ reviewed, ready
needs v26 branch before merging

@RobinTail
Copy link
Copy Markdown
Owner Author

✅ made v26 branch
🏁 ready

@RobinTail RobinTail merged commit 2b04ea4 into master Feb 1, 2026
13 checks passed
@RobinTail RobinTail deleted the make-v27 branch February 1, 2026 08:03
@dosubot
Copy link
Copy Markdown

dosubot Bot commented Feb 1, 2026

Related Documentation

Checked 1 published document(s) in 1 knowledge base(s). No updates required.

How did I do? Any feedback?  Join Discord

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking Backward incompatible changes CI/CD coverage Additional tests dedication dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant