Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
137 changes: 137 additions & 0 deletions bun.lock

Large diffs are not rendered by default.

7 changes: 6 additions & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ export default tseslint.config(
},
prettierConfig,
{
ignores: ["node_modules/**", "dist/**", "build/**"],
ignores: [
"node_modules/**",
"dist/**",
"build/**",
"src/extractors/__fixtures__/**",
],
},
);
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@
"format": "prettier --write .",
"format:check": "prettier --check .",
"tsc": "tsc --noEmit",
"test": "vitest run",
"test:watch": "vitest",
"test:smoke": "node scripts/smoke-test.mjs",
"prepublishOnly": "npm run build && npm run test:smoke"
},
Expand All @@ -47,7 +49,8 @@
"eslint-plugin-unused-imports": "^4.4.1",
"prettier": "^3.8.1",
"tsup": "^8.5.0",
"typescript-eslint": "^8.57.1"
"typescript-eslint": "^8.57.1",
"vitest": "^4.1.5"
},
"peerDependencies": {
"typescript": "^5"
Expand Down
1 change: 1 addition & 0 deletions src/extractors/__fixtures__/django/manage.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
# manage.py
12 changes: 12 additions & 0 deletions src/extractors/__fixtures__/django/myapp/consumers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from channels.generic.websocket import AsyncWebsocketConsumer


class ChatConsumer(AsyncWebsocketConsumer):
async def connect(self):
await self.accept()

async def disconnect(self, close_code):
pass

async def receive(self, text_data=None, bytes_data=None):
await self.send(text_data=text_data or "")
6 changes: 6 additions & 0 deletions src/extractors/__fixtures__/django/myapp/routing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.urls import path
from .consumers import ChatConsumer

websocket_urlpatterns = [
path("ws/chat/", ChatConsumer.as_asgi()),
]
8 changes: 8 additions & 0 deletions src/extractors/__fixtures__/django/myapp/urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from django.urls import path
from . import views

urlpatterns = [
path("api/health/", views.health),
path("", views.HomeView.as_view(), name="home"),
path("about/", views.about_page, name="about"),
]
17 changes: 17 additions & 0 deletions src/extractors/__fixtures__/django/myapp/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.shortcuts import render
from django.views.generic import TemplateView
from rest_framework.decorators import api_view
from rest_framework.response import Response


class HomeView(TemplateView):
template_name = "home.html"


def about_page(request):
return render(request, "about.html", {"title": "About"})


@api_view(["GET"])
def health(request):
return Response({"status": "ok"})
2 changes: 2 additions & 0 deletions src/extractors/__fixtures__/django/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
django
channels
34 changes: 34 additions & 0 deletions src/extractors/__fixtures__/express/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import express from "express";
import expressWs from "express-ws";

const app = express();
expressWs(app);

// API route — returns JSON.
app.get("/api/users", (req, res) => {
res.json({ users: [] });
});

// API route with explicit POST.
app.post("/api/users", (req, res) => {
res.json({ created: true });
});

// Page route — server-side rendered template.
app.get("/about", (req, res) => {
res.render("about", { title: "About" });
});

// Page route — file response.
app.get("/file", (req, res) => {
res.sendFile("/var/data/doc.pdf");
});

// WebSocket route via express-ws.
app.ws("/chat", (ws, req) => {
ws.on("message", (msg) => {
ws.send(`echo: ${msg}`);
});
});

app.listen(3000);
12 changes: 12 additions & 0 deletions src/extractors/__fixtures__/express/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "express-fixture",
"version": "0.0.0",
"private": true,
"type": "module",
"main": "index.js",
"dependencies": {
"express": "^4.18.0",
"express-ws": "^5.0.2",
"socket.io": "^4.7.0"
}
}
29 changes: 29 additions & 0 deletions src/extractors/__fixtures__/fastapi/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from fastapi import FastAPI, Request, WebSocket
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates

app = FastAPI()
templates = Jinja2Templates(directory="templates")


@app.get("/health")
async def health():
return {"status": "ok"}


@app.get("/about", response_class=HTMLResponse)
async def about():
return "<html><body><h1>About</h1></body></html>"


@app.get("/dashboard")
async def dashboard(request: Request):
return templates.TemplateResponse("dashboard.html", {"request": request})


@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):
await websocket.accept()
while True:
data = await websocket.receive_text()
await websocket.send_text(f"echo: {data}")
1 change: 1 addition & 0 deletions src/extractors/__fixtures__/fastapi/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
fastapi
13 changes: 13 additions & 0 deletions src/extractors/__fixtures__/flask/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from flask import Flask, jsonify, render_template

app = Flask(__name__)


@app.route("/api/users")
def list_users():
return jsonify({"users": []})


@app.route("/about")
def about():
return render_template("about.html")
1 change: 1 addition & 0 deletions src/extractors/__fixtures__/flask/requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
flask
8 changes: 8 additions & 0 deletions src/extractors/__fixtures__/go-gin/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module testapp

go 1.21

require (
github.com/gin-gonic/gin v1.9.1
github.com/gorilla/websocket v1.5.1
)
42 changes: 42 additions & 0 deletions src/extractors/__fixtures__/go-gin/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package main

import (
"net/http"

"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}

// listUsers is a plain JSON API handler — no upgrade.
func listUsers(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"users": []string{"alice", "bob"}})
}

// chatHandler upgrades the connection to websocket via gorilla.
func chatHandler(c *gin.Context) {
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
return
}
defer conn.Close()
for {
_, msg, err := conn.ReadMessage()
if err != nil {
break
}
if err := conn.WriteMessage(websocket.TextMessage, msg); err != nil {
break
}
}
}

func main() {
r := gin.Default()
r.GET("/api/users", listUsers)
r.GET("/ws", chatHandler)
r.Run(":8080")
}
8 changes: 8 additions & 0 deletions src/extractors/__fixtures__/laravel/composer.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "fixture/laravel-app",
"type": "project",
"require": {
"php": "^8.1",
"laravel/framework": "^10.0"
}
}
6 changes: 6 additions & 0 deletions src/extractors/__fixtures__/laravel/routes/api.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\UserController;

Route::get('/users', [UserController::class, 'index']);
7 changes: 7 additions & 0 deletions src/extractors/__fixtures__/laravel/routes/web.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\AboutController;

Route::get('/', fn() => view('home'));
Route::get('/about', [AboutController::class, 'show']);
9 changes: 9 additions & 0 deletions src/extractors/__fixtures__/nestjs/events.gateway.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { SubscribeMessage, WebSocketGateway } from "@nestjs/websockets";

@WebSocketGateway()
export class EventsGateway {
@SubscribeMessage("message")
handleMessage(client: unknown, payload: unknown) {
return { event: "message", data: payload };
}
}
11 changes: 11 additions & 0 deletions src/extractors/__fixtures__/nestjs/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"name": "nestjs-fixture",
"version": "0.0.0",
"private": true,
"dependencies": {
"@nestjs/core": "^10.0.0",
"@nestjs/common": "^10.0.0",
"@nestjs/websockets": "^10.0.0",
"@nestjs/platform-express": "^10.0.0"
}
}
17 changes: 17 additions & 0 deletions src/extractors/__fixtures__/nestjs/pages.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Controller, Get, Render } from "@nestjs/common";

@Controller()
export class PagesController {
@Get("about")
@Render("about")
renderAbout() {
return { title: "About us" };
}

// Sibling api method: must NOT inherit the @Render kind from the
// page handler immediately above it.
@Get("data")
getData() {
return { ok: true };
}
}
9 changes: 9 additions & 0 deletions src/extractors/__fixtures__/nestjs/users.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { Controller, Get } from "@nestjs/common";

@Controller("users")
export class UsersController {
@Get()
findAll() {
return [{ id: 1, name: "Ada" }];
}
}
3 changes: 3 additions & 0 deletions src/extractors/__fixtures__/rails/Gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
source 'https://rubygems.org'

gem 'rails', '~> 7.1'
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Api::BaseController < ActionController::API
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class Api::UsersController < Api::BaseController
def index
render json: []
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class ApplicationController < ActionController::Base
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
class PagesController < ApplicationController
def about
end
end
7 changes: 7 additions & 0 deletions src/extractors/__fixtures__/rails/config/routes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Rails.application.routes.draw do
get '/about' => 'pages#about'

namespace :api do
resources :users, only: [:index]
end
end
25 changes: 25 additions & 0 deletions src/extractors/__fixtures__/spring/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>

<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.demo;

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;

@Controller
public class ChatController {

@MessageMapping("/chat")
@SendTo("/topic/messages")
public String chat(String message) {
return message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class PageController {

@GetMapping("/about")
public String about() {
return "about";
}
}
Loading
Loading