NPM Version LICENSE Top language
social preview for next-go-modules
Go Modules proxy middleware designed for Next.js 13+, with perfect Vercel support.
- ✅ Out-of-the-box, simple configuration
- ✅ Support for personalized Go Modules addresses with aliases
- ✅ No Nginx dependency, perfect Vercel deployment support
- ✅ Compatible with Next.js 13.0+ (App Router & Pages Router)
- ✅ TypeScript support, configurable caching, debug mode
- ✅ Cross-version compatibility (avoids Next.js type conflicts)
# npm npm install next-go-modules # yarn yarn add next-go-modules # pnpm pnpm add next-go-modules
# Auto-generate all necessary files npx next-go-modules init # Or if installed globally next-go-modules init
This will automatically create:
config/go-modules.ts
- Module configuration filemiddleware.ts
- Next.js middleware- API route files (automatically detects App Router or Pages Router)
Then simply edit config/go-modules.ts
to add your Go modules configuration.
Note
If your project already has a middleware.ts
file, the CLI tool will provide integration guidance instead of overwriting the existing file.
// config/go-modules.ts import { GoModulesConfig } from 'next-go-modules' export const goModulesConfig: GoModulesConfig = { modules: { 'my-go-tool': { name: 'my-go-tool', fullName: 'yourdomain.com/my-go-tool', repo: 'https://github.com/yourusername/my-go-tool', description: 'Your Go tool description', install: 'go get -u yourdomain.com/my-go-tool', version: 'v1.0.0', aliases: ['tool'], // Optional aliases }, // Add more modules here... }, }
Option A: Using the helper function (Recommended for Next.js 15)
// src/middleware.ts (if using src directory) or middleware.ts (project root) import { createGoModulesMiddleware } from 'next-go-modules' import { goModulesConfig } from './config/go-modules' const goModulesMiddleware = createGoModulesMiddleware({ config: goModulesConfig, debug: process.env.NODE_ENV === 'development', }) export default function middleware(request: any) { return goModulesMiddleware(request) } export const config = { matcher: [ '/((?!api|_next/static|_next/image|favicon.ico|manifest.webmanifest|sitemap.xml).*)', ], }
// app/api/go-modules/[...module]/route.ts (App Router) import { createGoModulesApiRoute, createGoModulesHeadRoute } from 'next-go-modules' import { goModulesConfig } from '../../../../config/go-modules' export const GET = createGoModulesApiRoute(goModulesConfig) export const HEAD = createGoModulesHeadRoute(goModulesConfig)
Or using Pages Router:
// pages/api/go-modules/[...module].ts (Pages Router) import { createGoModulesApiRoute } from 'next-go-modules' import { goModulesConfig } from '../../../config/go-modules' export default createGoModulesApiRoute(goModulesConfig)
Now your Go modules will be accessible at:
/my-go-tool
- Main path/tool
- Alias path/my-go-tool?go-get=1
- With go-get parameter
Users can install your Go modules with:
go get -u yourdomain.com/my-go-tool
interface GoModule { name: string // Module name fullName: string // Full module path (e.g., 'example.com/module') repo: string // Repository URL description: string // Module description install: string // Installation command tags?: string[] // Optional tags version?: string // Optional version aliases?: string[] // Optional aliases }
interface GoModulesConfig { modules: Record<string, GoModule> apiRoute?: string // Default: '/api/go-modules' matcher?: string[] // Default: excludes static files cacheControl?: string // Default: 'public, max-age=3600' }
interface MiddlewareOptions { config: GoModulesConfig debug?: boolean // Enable debug logging }
const config: GoModulesConfig = { modules: { /* your modules */ }, apiRoute: '/api/custom-go-modules', }
const config: GoModulesConfig = { modules: { /* your modules */ }, cacheControl: 'public, max-age=7200', // 2 hours }
const config: GoModulesConfig = { modules: { /* your modules */ }, matcher: [ '/((?!api|_next|favicon.ico).*)', ], }
const middleware = createGoModulesMiddleware({ config: goModulesConfig, debug: true, // Enable console logging })
If you already have middleware, you can use the compose function:
// middleware.ts import { composeMiddleware, createGoModulesMiddleware } from 'next-go-modules' import { goModulesConfig } from './config/go-modules' // Your existing middleware function yourExistingMiddleware(request) { // Your logic } // Go modules middleware const goModulesMiddleware = createGoModulesMiddleware({ config: goModulesConfig, debug: process.env.NODE_ENV === 'development', }) // Compose middlewares export default composeMiddleware( goModulesMiddleware, yourExistingMiddleware )
getGoModule(modulePath, modules)
- Get module by path or aliasgetAllGoModules(modules)
- Get all modulesgetAllModulePaths(modules)
- Get all available pathsgenerateGoModuleHTML(module)
- Generate HTML for module
createGoModulesMiddleware(options)
- Create middleware functiongetGoModulesMiddlewareConfig(options)
- Get middleware config
createGoModulesApiRoute(config)
- Create GET handlercreateGoModulesHeadRoute(config)
- Create HEAD handler
const config: GoModulesConfig = { modules: { 'go-masker': { name: 'go-masker', fullName: 'normalcoder.com/go-masker', repo: 'https://github.com/normal-coder/go-masker', description: 'Data masking tool', install: 'go get -u normalcoder.com/go-masker', aliases: ['masker', 'data-masker'], }, 'go-validator': { name: 'go-validator', fullName: 'normalcoder.com/go-validator', repo: 'https://github.com/normal-coder/go-validator', description: 'Data validation tool', install: 'go get -u normalcoder.com/go-validator', aliases: ['validator', 'validate'], }, }, }
This supports:
/go-masker
,/masker
,/data-masker
/go-validator
,/validator
,/validate
This package works seamlessly with Vercel deployment. No additional configuration needed.
The middleware is compatible with any platform that supports Next.js middleware.
# Clone repository git clone https://github.com/normal-coder/next-go-modules.git cd next-go-modules # Install dependencies pnpm install # Development mode pnpm dev # Lint code pnpm lint # Build pnpm build
This project uses Conventional Commits:
# Use commitizen for interactive commits pnpm commit # Or manually follow the format git commit -m "feat: add new feature" git commit -m "fix: resolve issue" git commit -m "docs: update readme"
Using Changesets for version management:
# Add changeset pnpm changeset # Version packages pnpm version # Release to npm pnpm release
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
pnpm commit
) - Push to the branch (
git push origin feature/amazing-feature
) - Create a Pull Request
- Next.js - React full-stack framework
- TypeScript
- ESLint
- Husky
- Changesets
- Commitizen
MIT License - see LICENSE file for details.