EvoX Genesis
EvoX Genesis는 고수준 목표를 재귀적 소프트웨어 세계로 전환해, 유한 에이전트가 개발하고 승인된 결과만 유지됩니다
NestJS 앱의 모듈·프로바이더·주입을 TypeScript 소스에서 바로 매핑해 브라우저에서 탐색합니다
Map a NestJS app's modules, providers and injections straight from its TypeScript source, then explore the map in your browser.
개발 도구TypeScript · CSSGitHub @DoIttikorn온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기demonstrators nest project
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Map a NestJS app — modules, providers, controllers and who injects what — straight from its TypeScript source, then explore the map in your browser.
npx nest-cartograph
Nothing in your app runs: no database, no environment variables, no build. The analyzer reads the code with the TypeScript compiler API, the same way your editor does.
Two steps, like go test -coverprofile followed by go tool cover -html:
| Step | Command | Output |
|---|---|---|
| 1. Analyze | npx nest-cartograph analyze | cartograph.json |
| 2. View | npx nest-cartograph view cartograph.json | an interactive map at http://localhost:4300 |
npx nest-cartograph with no command does both, without writing the JSON.
cartograph.json is deterministic — no timestamps, everything sorted — so you can commit it and review how the architecture changed in a pull request.
npx nest-cartograph analyze # writes ./cartograph.json
npx nest-cartograph analyze -p apps/api/tsconfig.json -o docs/cartograph.json
npx nest-cartograph analyze -o - | jq '.cycles' # JSON to stdout
npx nest-cartograph analyze --fail-on-cycles # exit code 2 on circular imports without forwardRef()
npx nest-cartograph view # serves ./cartograph.json and opens the browser
npx nest-cartograph view docs/cartograph.json --port 5055 --no-open
npx nest-cartograph view -o cartograph.html # one self-contained HTML file, no server needed
Summaries, warnings and cycles go to stderr. Run npx nest-cartograph --help for everything.
On a big app the Providers view is too dense to read. Type a name in the search box and press Enter to see only the flow around the matches, laid out left to right from controllers to repositories and Kafka producers. The panel on the left filters it:
Controller → IFooService → FooService reads Controller → FooService.ReportModule when searching employee,
with a checkbox to drop it.Esc closes the panels, then leaves the flow view. Show flow in a node's details does the same for that node.
When the map is served by nest-cartograph view (or plain npx nest-cartograph), a node's details
have Open in VS Code and Open in Zed links that jump to the class's line, through the editors'
vscode:// and zed:// links. A file written with -o leaves them out: it is meant to be shared, so
it carries no paths from your machine.
| In your code | On the map |
|---|---|
@Module({ imports, providers, controllers, exports }) | modules, what they own, what they export |
ConfigModule.forRoot(...), TypeOrmModule.forFeature(...) | an import labelled with the method |
static forRoot() { return { module: ThisModule, providers, exports, global } } | the returned module's providers and exports |
@Global() | global modules |
forwardRef(() => X) in imports and @Inject() | dashed edges and cycle detection |
[...SHARED_PROVIDERS], providers: ORDERS_PROVIDERS, .concat() | arrays held in constants, across files |
useClass, useValue, useFactory + inject, useExisting | custom providers |
constructor parameters, @Inject(TOKEN), @Optional(), @Inject() properties | injection edges |
string tokens, Symbol('x'), constants holding either | one node per token, shared by provider and consumer |
@InjectRepository(User), @InjectModel(Cat.name), ... | a token named after the decorator call |
It also warns about decorated classes that no module registers, injections without a token, and anything it could not resolve.
Limits. Static analysis does not run code: modules picked at runtime (both sides of cond ? A : B are shown), providers built in loops, and providers created inside third-party dynamic modules are not visible.
{
"schemaVersion": 1,
"project": { "root": ".", "tsconfig": "tsconfig.json" },
"nodes": [
{ "id": "src/users/users.module.ts#UsersModule", "kind": "module", "name": "UsersModule", "file": "src/users/users.module.ts", "line": 6 },
{ "id": "src/users/users.service.ts#UsersService", "kind": "provider", "providerType": "class", "name": "UsersService", "file": "src/users/users.service.ts", "line": 8 }
],
"edges": [
{ "from": "src/app.module.ts#AppModule", "to": "src/users/users.module.ts#UsersModule", "kind": "imports" },
{ "from": "src/users/users.module.ts#UsersModule", "to": "src/users/users.service.ts#UsersService", "kind": "provides" }
],
"cycles": [{ "ids": ["..."], "names": ["UsersModule", "OrdersModule"], "guarded": true }],
"warnings": []
}
Edge kinds: imports, provides, controls, exports, injects, aliases. The full types are in src/schema.ts, and also exported:
import { analyze, type Cartograph } from 'nest-cartograph';
const map: Cartograph = analyze({ project: 'tsconfig.json' });
Node.js 22 or later. The analyzer brings its own TypeScript 6, so it works whatever TypeScript your project uses — including TypeScript 7, which has no compiler API yet.
npm install
npm test # analyzer golden test + UI logic tests (vitest)
npm run test:update # rewrite test/testdata/app.golden.json after an intended change
npm run lint # oxlint
npm run typecheck # src + test, and ui/
npm run build # tsc → dist/, then vite → dist/ui/index.html
npm run dev:ui # UI with hot reload, on the fixture app's map
npm run build:website # website/ → website/dist, with the fixture app's map as the live demo
node dist/cli/index.js -p test/fixtures/tsconfig.json # try the built CLI
src/
cli/ index.ts (commands) · analyze.ts (step 1) · view.ts (step 2: server, browser) · html.ts (embed JSON in the UI)
analyzer/ index.ts (the passes) · program.ts (tsconfig → ts.Program) · resolve.ts (names → classes, tokens, arrays)
modules.ts (@Module, forRoot) · providers.ts (custom providers) · injection.ts (constructors, @Inject)
context.ts (shared state) · ast.ts (syntax helpers)
graph/ builder.ts (dedupe, placeholders, stable order) · cycles.ts (Tarjan)
schema.ts the cartograph.json contract, shared with the UI
ui/ React + React Flow (@xyflow/react) + elkjs, built by Vite into ONE html file
src/ App.tsx · load.ts · toFlow.ts (JSON → nodes/edges) · layout.ts (ELK positions + edge routes)
measure.ts (text widths) · nodes/ · edges/RoutedEdge.tsx · panels/
test/
fixtures/app a NestJS app exercising every case above
testdata/ golden output
Releases: bump version in package.json, commit, then git tag v0.1.0 && git push --tags. The release workflow publishes with npm Trusted Publishing. The very first version has to be published by hand (npm publish), because the Trusted Publisher setting lives on the package's page on npmjs.com.
MIT. The bundled UI includes elkjs (EPL-2.0) and React Flow (MIT).