monaco-editor-lsp-next
Go to file
2025-03-16 16:06:33 +08:00
.github/workflows feat(workflow): split Docker build and push into separate workflows for Monaco and LSP images 2025-03-11 14:41:48 +08:00
docker/lsp/clangd feat(docker): simplify docker compose commands and add compose.yml for service configuration 2025-02-21 19:56:49 +08:00
prisma feat(prisma): add LanguageServerConfig model and relationship with EditorLanguageConfig 2025-03-16 14:39:23 +08:00
public chore(public): add placeholder SVG image 2025-03-14 14:38:11 +08:00
src feat(workspace-editor): add languageServerConfigs support to WorkspaceEditorHeader 2025-03-16 16:06:33 +08:00
.dockerignore chore(dockerignore): add exception for prisma/schema.prisma 2025-03-06 14:39:44 +08:00
.env.example docs(env): add PostgreSQL credentials, update DATABASE_URL format, and improve placeholders and comments 2025-03-15 21:37:56 +08:00
.gitignore chore(gitignore): remove prisma/migrations from ignored files 2025-03-11 15:52:25 +08:00
bun.lock feat(components/ui): add Form component from shadcn/ui 2025-03-14 15:55:37 +08:00
components.json chore: initialize shadcn/ui 2025-02-19 09:07:30 +08:00
compose.yml feat(compose): add judge4c and postgres services, update lsp-c and lsp-cpp configurations, and change network to judge4c 2025-03-15 21:31:31 +08:00
demo.png chore(images): replace demo image with new version 2025-03-05 10:30:27 +08:00
Dockerfile chore(docker): update Dockerfile to optimize build steps and remove redundant copying of .env file 2025-03-15 20:15:49 +08:00
eslint.config.mjs chore: initialize the project 2025-02-19 09:00:15 +08:00
LICENSE chore: add MIT License file to the repository 2025-02-19 18:38:49 +08:00
next.config.ts feat(next.config): add dockerode to serverExternalPackages 2025-02-26 21:18:33 +08:00
package.json chore(scripts): update postinstall script and remove prisma migrate deploy 2025-03-15 20:14:57 +08:00
postcss.config.mjs chore(postcss): support GitHub Markdown theme switching 2025-03-06 21:19:48 +08:00
README.md docs(readme): update Docker deployment instructions and add environment configuration details 2025-03-15 22:00:48 +08:00
tailwind.config.ts feat(components/ui): add Sidebar-13 component from shadcn/ui 2025-03-03 14:51:13 +08:00
tsconfig.json chore: initialize the project 2025-02-19 09:00:15 +08:00

monaco-editor-lsp-next

A seamless Next.js integration of the Monaco Editor with robust LSP support all without SSR hassles.

demo

⚠️ LSP Configuration and Environment Variable Limitations

Warning: Pre-built Image LSP Configuration Limitations

The pre-built Docker image cfngc4594/monaco-editor-lsp-next is configured to connect exclusively to ws://localhost:4594/clangd and ws://localhost:4595/clangd. This is due to the LSP configuration being set via NEXT_PUBLIC environment variables during the image build process.

  • Build-Time Freezing: As per the Next.js official documentation, NEXT_PUBLIC variables are frozen at build time, and subsequent changes are ineffective.
  • Local LSP Server Dependency: Therefore, the pre-built image can only connect to the specified local LSP servers.
  • Custom Configuration Requirement: If you wish to define your own LSP configuration via environment variables, you cannot use the pre-built image. Instead, you must:
    • Clone the source code.
    • Set your desired environment variables.
    • Manually build the Docker image.

Upcoming Improvements (v0.0.1):

To address these limitations, v0.0.1 will implement the officially recommended API approach for retrieving LSP configurations, enabling runtime dynamic LSP server configuration without image rebuilding.

⚠️ WSL Users: Critical Configuration

🐧 Network Mode Requirement

When using Windows Subsystem for Linux (WSL), you must configure your network mode as Mirrored to ensure proper LSP server connectivity. Standard WSL network configurations may create IPv6 conflicts that block Monaco-LSP communication.

🔧 Mirror Mode Setup:

  1. Open WSL settings ⚙️
  2. Navigate to Network section 🌐
  3. Select Mirrored mode 🔄
  4. Restart WSL instance 💻

Complete these steps before launching the editor for seamless LSP integration! 🎉

🚀 Getting Started

Deploy the project quickly using Docker. Follow the steps below:

Step 1: Clone the Repository

git clone https://github.com/cfngc4594/monaco-editor-lsp-next
cd monaco-editor-lsp-next

Step 2: Install Dependencies

This project uses bun as the default package manager, but you can also use other package managers like npm, yarn, or pnpm if you prefer.

If you choose to use a package manager other than bun, you should delete the bun.lock file from your project directory.

The Dockerfile is designed to dynamically detect and adapt to the package manager you are using, ensuring compatibility with your preferred tool.

bun install

Step 3: Configure Environment Variables

  1. Copy the example environment file:

    cp .env.example .env
    
  2. Open the .env file and set the following variables:

    • PostgreSQL Credentials:

      POSTGRES_USER="your_postgres_user"
      POSTGRES_PASSWORD="your_postgres_password"
      POSTGRES_DB="your_postgres_db"
      
    • Authentication Secret: Generate a secure secret key using:

      bunx auth secret
      

      Then, set the AUTH_SECRET variable:

      AUTH_SECRET="your_auth_secret"
      
    • GitHub OAuth (Optional): If you need GitHub OAuth, replace the following variables with your GitHub OAuth credentials:

      AUTH_GITHUB_ID="your_github_client_id"
      AUTH_GITHUB_SECRET="your_github_client_secret"
      

Step 4: Start the Application

Once the environment variables are configured, start the application using Docker Compose:

docker compose up -d --build

Step 5: Access the Application

The application should now be running. You can access it at:

  • Web Interface: http://localhost:3000
  • LSP Service (C Language): ws://localhost:4594/clangd
  • LSP Service (C++ Language): ws://localhost:4595/clangd

📁 .env.example File

For reference, you can see the content of the .env.example file.

⚙️ Technical Configuration

LSP Server Mapping

Language LSP Server Port
C clangd 4594
C++ clangd 4595

📦 Dependency Management

🔒 Version Lock Requirements

Critical Pairing:

Package Max Version Reference
monaco-editor ≤0.36.1 Compatibility Matrix
monaco-languageclient ≤5.0.1

Version Lock Rationale:

  1. API Stability

    • Newer monaco-editor (≥0.40.0) breaks monaco-languageclient integration
    • v0.36.1 matches @codingame/monaco-vscode-api@1.76.9 requirements
  2. LSP Feature Breakdown

    • Version mismatches disable:
      • Auto textDocument/didOpen events
      • textDocument/inlayHint resolution
      • textDocument/documentLink functionality
  3. Version Conflict

    • @codingame package versioning (e.g., 11.1.2) ≠ monaco-editor versions (e.g., 0.36.1)
    • @monaco-editor/react depends on monaco-editor versioning scheme

Failure Indicators:

  • ✔️ WebSocket connection established
  • Missing syntax highlighting
  • No autocomplete suggestions
  • Silent LSP initialization failures

🎨 Shiki Compatibility Notice

Syntax highlighting depends on rehype-pretty-code's deprecated getHighlighter API from shiki@legacy.

Key Points:

  • Affected File: src/components/mdx-preview.tsx

  • Dependency Chain: rehype-pretty-codeshiki@legacy

  • Version Constraints:

    "shiki": "<=2.5.0"
    "@shikijs/monaco": "<=2.5.0"
    

Maintenance Note:
While shiki@3.0.0+ introduces modern APIs (createHighlighter/getSingletonHighlighter), upgrading requires rehype-pretty-code updates. Track progress here.