generate-knit-types
v1.1.0
Published
Auto-generate Luau type definitions for Knit services and controllers
Maintainers
Readme
generate-knit-types
Auto-generate Luau type definitions for Knit services and controllers. Get full IDE IntelliSense for your Roblox Knit framework! 🚀
Features
- ✅ Automatic type generation from service/controller files
- ✅ Supports multi-line return types
- ✅ Client vs server method detection
- ✅ Extracts table-literal controller/service properties (e.g.
NotificationStyles) - ✅ Recursive directory scanning (nested folders supported)
- ✅ Dedupe for repeated methods
- ✅ Zero configuration (uses Knit conventions)
- ✅ Works with all Luau-supporting IDEs
Installation
npm install --save-dev generate-knit-typesUsage
Quick Start
Add to your package.json:
{
"scripts": {
"generate-types": "generate-knit-types",
"build": "npm run generate-types && rojo build -o Code.rbxlx"
}
}Then run:
npm run generate-typesThis generates src/shared/Components/KnitTypes.luau
Custom Directories
generate-knit-types --services src/server/MyServices --controllers src/client/MyControllers --output src/Types.luauIn Your Code
Controllers (Client-side)
local KnitTypes = require(ReplicatedStorage.Components.KnitTypes)
local BankService = KnitTypes.GetService("BankService") :: KnitTypes.BankService
-- IntelliSense now works! ✨
local maxStorage: number = BankService:GetMaxStorage(player)
local info = BankService:GetBankInfo(player) -- Returns typed tableServices (Server-side)
local KnitTypes = require(ReplicatedStorage.Components.KnitTypes)
local SkinController = KnitTypes.GetController("SkinController") :: KnitTypes.SkinController
SkinController:CreateSkinViewport(viewport, model)How It Works
The script scans your:
src/server/Services/- Extracts service typessrc/shared/Controllers/- Extracts controller types
Generates:
- Full service types (all server + client methods)
- Client-specific types (only
.Client:methods) - All controller types
- Utility functions:
GetService<T>()andGetController<T>()
Type Detection
- Parameters: Extracts type annotations from function signatures
- Return Types: Handles single-line (
number,string) and multi-line table types - Client Methods: Automatically detects
.Client:marker in function definitions - Properties: Infers table-literal property shapes assigned on Knit roots
Robustness Notes
- Unknown or runtime-only expressions in inferred property values are safely emitted as
any. - Inline one-line methods like
function X:KnitStart(): () endare handled correctly. - Output ordering is stable (sorted), so generated diffs are predictable.
Example Output
For BankService:
export type BankService = {
GetMaxStorage: (self: any, player: Player) -> number,
SaveBank: (self: any, player: Player) -> { ok: boolean, saved: number?, message: string? },
GetBankInfo: (self: any, player: Player) -> {
maxStorage: number,
nextUpgradeCost: number,
storageLevel: number,
loadTimerDuration: number,
},
}
export type BankServiceClient = {
SaveBank: (self: any, player: Player) -> { ok: boolean, saved: number?, message: string? },
}Project Structure
Your Roblox project should follow this structure:
project/
├── src/
│ ├── server/
│ │ └── Services/ ← Services here
│ ├── shared/
│ │ ├── Controllers/ ← Controllers here
│ │ └── Components/ ← Generated types go here
│ └── client/
├── package.json
└── default.project.jsonCLI Options
generate-knit-types [options]
Options:
--services DIR Services directory (default: src/server/Services)
--controllers DIR Controllers directory (default: src/shared/Controllers)
--output FILE Output file (default: src/shared/Components/KnitTypes.luau)Requirements
- Node.js 14+
- Your project uses Knit framework
- Services in
src/server/Services/ - Controllers in
src/shared/Controllers/
License
MIT
