# Fn Args Deps

> Enforces the fn(args, deps) pattern: business logic as functions with explicit dependency injection instead of service classes. Use this skill when writing or refactoring TypeScript business logic, replacing classes, structuring deps, or setting up a composition root. Do not use when/for React component structure (use react-development) or Result/error modeling alone (use result-types).

- Skill: `jagreehal/fn-args-deps` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add jagreehal/fn-args-deps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jagreehal/fn-args-deps/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: jagreehal (https://skillmd.com/u/jagreehal)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/jagreehal/fn-args-deps

---


# Functions Over Classes: fn(args, deps)

## Critical rules

- Business logic is `fn(args, deps)` — never service classes. `args` are per-call; `deps` are long-lived collaborators.
- Declare a per-function deps type. No god `AllServiceDeps` objects.
- Wire deps once at a composition root. Handlers call factories, not constructors mid-request.
- Inject only network/disk/clock collaborators. Import pure utilities directly.
- Use `import type` for infra interfaces; instances arrive via `deps`.
- Before writing examples or grouping choices, read [references/examples.md](references/examples.md) and [references/patterns.md](references/patterns.md).

## Workflow

1. Identify business logic that should be a function (or extract it from a class).
2. Split per-call data into `args` and collaborators into a named `XDeps` type.
3. Before choosing individual vs grouped injection, read [references/patterns.md](references/patterns.md).
4. Implement `fn(args, deps)`. Keep classes only as thin framework wrappers or stateful resources.
5. Add a factory / composition-root wire-up so call sites never construct deps.
6. Test with `mock<XDeps>()` — no class instantiation. See [references/examples.md](references/examples.md).

## Resources

- [references/examples.md](references/examples.md) — WRONG vs CORRECT signatures, composition root, NestJS wrapper, tests. Read when implementing or reviewing.
- [references/patterns.md](references/patterns.md) — grouping, migration, when classes are OK, enforcement, rationalizations. Read before structuring modules.

## Validation

- [ ] Every business function is `fn(args, deps)` with a per-function deps type
- [ ] No unused `deps` fields; no god deps bag
- [ ] Deps wired once at composition root
- [ ] Infra via `import type` only; instances via `deps`
- [ ] Pure utilities imported, not injected
- [ ] Remaining classes are wrappers, stateful resources, or builders
- [ ] Tests use `mock<XDeps>()` without instantiating a class

## Constraints

- Framework-mandated classes, connection pools, caches, and fluent builders may stay as thin wrappers over pure functions.
- Related: `result-types`, `validation-boundary`, `testing-strategy`, `writing-tests`, `observability`, `strict-typescript`, `pattern-enforcement`.

