Skip to content

normal-coder/next-go-modules

Repository files navigation

next-go-modules

NPM Version LICENSE Top language

social preview for next-go-modules

Go Modules proxy middleware designed for Next.js 13+, with perfect Vercel support.

English | 中文

Features

  • âś… 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)

Installation

# npm
npm install next-go-modules

# yarn
yarn add next-go-modules

# pnpm
pnpm add next-go-modules

Quick Start

Option 1: Using CLI Tool (Recommended)

# 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 file
  • middleware.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.

Option 2: Manual Setup

1. Create your modules configuration

// 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...
  },
}

2. Create your middleware

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).*)',
  ],
}

3. Create your API route

// 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)

Usage

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

Configuration Options

GoModule

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
}

GoModulesConfig

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'
}

MiddlewareOptions

interface MiddlewareOptions {
  config: GoModulesConfig
  debug?: boolean // Enable debug logging
}

Advanced Usage

Custom API Route

const config: GoModulesConfig = {
  modules: { /* your modules */ },
  apiRoute: '/api/custom-go-modules',
}

Custom Cache Control

const config: GoModulesConfig = {
  modules: { /* your modules */ },
  cacheControl: 'public, max-age=7200', // 2 hours
}

Custom Matcher

const config: GoModulesConfig = {
  modules: { /* your modules */ },
  matcher: [
    '/((?!api|_next|favicon.ico).*)',
  ],
}

Debug Mode

const middleware = createGoModulesMiddleware({
  config: goModulesConfig,
  debug: true, // Enable console logging
})

Integration with Existing Middleware

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
)

API Reference

Core Functions

  • getGoModule(modulePath, modules) - Get module by path or alias
  • getAllGoModules(modules) - Get all modules
  • getAllModulePaths(modules) - Get all available paths
  • generateGoModuleHTML(module) - Generate HTML for module

Middleware Functions

  • createGoModulesMiddleware(options) - Create middleware function
  • getGoModulesMiddlewareConfig(options) - Get middleware config

API Route Functions

  • createGoModulesApiRoute(config) - Create GET handler
  • createGoModulesHeadRoute(config) - Create HEAD handler

Examples

Multiple Modules with Aliases

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

Deployment

Vercel

This package works seamlessly with Vercel deployment. No additional configuration needed.

Other Platforms

The middleware is compatible with any platform that supports Next.js middleware.

Development

Development Setup

# 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

Commit Convention

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"

Version Management

Using Changesets for version management:

# Add changeset
pnpm changeset

# Version packages
pnpm version

# Release to npm
pnpm release

Contributing

  1. Fork the repository
  2. Create your feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (pnpm commit)
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Create a Pull Request

Acknowledgments

License

MIT License - see LICENSE file for details.

About

Go Modules proxy middleware designed for Next.js 13+, with perfect Vercel support.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published