К основному содержанию
скилл · Claude Code

migrate-to-shoehorn — скилл для Claude Code: миграция тестов

Переводит type assertions с `as` в тестах на функции из `@total-typescript/shoehorn`. Нужен для частичных объектов и намеренно неверных данных в проверках.

  • Автор Matt Pocock
  • Лицензия MIT
  • GitHub ★ 302 251
  • Установок 475 388
  • Обновлён 2026-10-22
  • Исходник показан ниже
Открыть на GitHub ↗

Что делает migrate-to-shoehorn

Скилл ищет в тестовых файлах утверждения типов через as и меняет их на вызовы Shoehorn. Конструкцию as Type он заменяет на fromPartial(), чтобы передавать только нужные поля объекта.

Для данных с ошибочным типом в тесте применяется fromAny(). Скилл добавляет импорты из @total-typescript/shoehorn и предлагает проверить типы после миграции. Для полного объекта предусмотрен fromExact(), который позднее можно заменить на fromPartial().

Shoehorn предназначен только для тестового кода. Его стоит ставить командам, у которых тесты переполнены заглушками больших объектов или двойными приведениями as unknown as Type.

Какие задачи решает

  • заменить as Type на fromPartial() в тестах
  • передать часть полей большого объекта
  • проверить обработку намеренно неверных данных через fromAny()
  • найти assertions в файлах *.test.ts и *.spec.ts
  • добавить импорты @total-typescript/shoehorn

Как установить migrate-to-shoehorn

Команда из источника

/plugin marketplace add mattpocock/skills

Команда из источника

/plugin install mattpocock-skills@mattpocock

Команда из источника

npx skills add mattpocock/skills --skill migrate-to-shoehorn -a claude-code

Через Skills CLI (Vercel)

npx skills add mattpocock/skills --skill migrate-to-shoehorn -a claude-code

Вручную

~/.claude/skills/migrate-to-shoehorn/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/migrate-to-shoehorn/

Как пользоваться: примеры запросов

  • «Найди в тестах `as Request` и перенеси их на shoehorn.»
  • «Замени `as unknown as Type` в `*.spec.ts` на `fromAny()`.»
  • «Нужно передать частичный Request в тесте без заполнения всех полей.»

Исходный текст

SKILL.md · MIT
---
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.
---

# 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

| Function        | Use 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?

2. **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

© Matt Pocock · MIT · mattpocock/skills

Вопросы о migrate-to-shoehorn

Как установить migrate-to-shoehorn в Claude Code?

Добавьте скилл командой npx skills add mattpocock/skills --skill migrate-to-shoehorn -a claude-code.

Что делает migrate-to-shoehorn?

Скилл переносит тесты с type assertions через as на функции пакета @total-typescript/shoehorn. Он различает частичные данные и намеренно неверные значения.

Когда использовать fromPartial(), fromAny() и fromExact()?

fromPartial() подходит для неполных данных, которые проходят проверку типов. fromAny() используют для неверных данных в тестах, а fromExact() требует полный объект.

Похожие

skill-creator Помогает создать новый скилл, доработать существующий и проверить результат через тестовые промпты и оценки. Claude Code · Claude.ai ★ 183 434 ↓ 414 180 improve-codebase-architecture Скилл ищет архитектурные узкие места в кодовой базе и показывает варианты углубления модулей в HTML-отчёте. Подойдёт для ревью перед рефакторингом. Claude Code ★ 302 251 ↓ 1 163 035 tdd Скилл управляет циклом красный-зелёный в TDD: проверяет, что тесты пишутся до кода, держит их на уровне публичных интерфейсов и не завязывает на внутреннюю структуру. Claude Code ★ 302 251 ↓ 1 141 062 prototype Создаёт временный прототип, чтобы проверить логику, модель состояния или вид интерфейса до работы над основным кодом. Claude Code ★ 302 251 ↓ 986 201 codebase-design Скилл помогает проектировать модули с небольшим интерфейсом и скрытой внутри сложностью. Подходит для рефакторинга, тестируемости и поиска чистого seam. Claude Code ★ 302 251 ↓ 850 344 diagnosing-bugs Скилл ведёт агента через воспроизводимую диагностику сложных багов и регрессий производительности. Нужен, когда код падает, работает неверно или тормозит. Claude Code ★ 302 251 ↓ 834 802

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой