<< All versions

Skill v1.0.0

currentAutomated scan100/100
hermesonehq/hermes-registry/migrate-to-shoehorn
──Details
PublishedOctober 7, 2026 at 11:21 PM
Content Hashsha256:e43c68db465464a1...
Git SHA9eac45a2beba
──Files
Files (1 file, 3.0 KB)
SKILL.md3.0 KBactive
SKILL.md · 134 lines · 3.0 KB

name: migrate-to-shoehorn description: Migrate test files from as type assertions to @total-typescript/shoehorn. Use when user mentions shoehorn, wants to replace as in tests, or needs partial test data. version: 1.0.0 author: mattpocock license: MIT platforms:

  • linux
  • macos
  • windows

source: https://github.com/mattpocock/skills/tree/main/skills/misc/migrate-to-shoehorn metadata: hermes: icon: lucide:arrow-left-right tags:

  • Migration
  • Shoehorn
  • Refactoring

Migrate to Shoehorn

Why shoehorn?

shoehorn lets you pass partial data in tests while keeping TypeScript happy. It replaces as assertions with type-safe alternatives.

Test code only. Never use shoehorn in production code.

Problems with as in tests:

  • Trained not to use it
  • Must manually specify target type
  • Double-as (as unknown as Type) for intentionally wrong data

Install

bash
npm i @total-typescript/shoehorn

Migration patterns

Large objects with few needed properties

Before:

ts
type Request = {
body: { id: string };
headers: Record<string, string>;
cookies: Record<string, string>;
// ...20 more properties
};
it("gets user by id", () => {
// Only care about body.id but must fake entire Request
getUser({
body: { id: "123" },
headers: {},
cookies: {},
// ...fake all 20 properties
});
});

After:

ts
import { fromPartial } from "@total-typescript/shoehorn";
it("gets user by id", () => {
getUser(
fromPartial({
body: { id: "123" },
}),
);
});

as Type → fromPartial()

Before:

ts
getUser({ body: { id: "123" } } as Request);

After:

ts
import { fromPartial } from "@total-typescript/shoehorn";
getUser(fromPartial({ body: { id: "123" } }));

as unknown as Type → fromAny()

Before:

ts
getUser({ body: { id: 123 } } as unknown as Request); // wrong type on purpose

After:

ts
import { fromAny } from "@total-typescript/shoehorn";
getUser(fromAny({ body: { id: 123 } }));

When to use each

FunctionUse case
fromPartial()Pass partial data that still type-checks
fromAny()Pass intentionally wrong data (keeps autocomplete)
fromExact()Force full object (swap with fromPartial later)

Workflow

  1. Gather requirements - ask user:
  • What test files have as assertions causing problems?
  • Are they dealing with large objects where only some properties matter?
  • Do they need to pass intentionally wrong data for error testing?
  1. Install and migrate:
  • [ ] Install: npm i @total-typescript/shoehorn
  • [ ] Find test files with as assertions: grep -r " as [A-Z]" --include="*.test.ts" --include="*.spec.ts"
  • [ ] Replace as Type with fromPartial()
  • [ ] Replace as unknown as Type with fromAny()
  • [ ] Add imports from @total-typescript/shoehorn
  • [ ] Run type check to verify
All versions