Skip to main content

Next.js Initialization

Configuration and setup procedures for Intrig Next.js integration. Documents package installation, project initialization, and IntrigLayout configuration for App Router applications.


Package Installation

Install Intrig core and Next.js framework packages:

npm install @intrig/core @intrig/next
# or
yarn add @intrig/core @intrig/next
# or
pnpm add @intrig/core @intrig/next

Package roles:

  • @intrig/core: CLI tools, code generation, and synchronization
  • @intrig/next: Next.js-specific server functions, client hooks, and middleware

Project Initialization

Initialize Intrig configuration from the project root:

intrig init

Initialization Process

The initialization command performs these operations:

Configuration File Creation: Generates intrig.config.json with Next.js settings:

{
"$schema": "https://raw.githubusercontent.com/intrigsoft/intrig-registry/refs/heads/main/schema.json",
"sources": [],
"generator": "next"
}

Repository Configuration: Updates .gitignore to exclude generated artifacts:

# Intrig
.intrig/cache/
.intrig/daemon/
node_modules/@intrig/

Framework Detection: Identifies Next.js projects through package.json dependencies and configures the Next.js generator.


IntrigLayout Setup

Configure IntrigLayout in the root layout to enable client-side Intrig functionality.

App Router Configuration

// app/layout.tsx
import { IntrigLayout } from '@intrig/next';
import { ReactNode } from 'react';

export default function RootLayout({ children }: { children: ReactNode }) {
return (
<html lang="en">
<body>
<IntrigLayout
configs={{
baseURL: process.env.NEXT_PUBLIC_API_URL,
timeout: 5000,
headers: {
'Content-Type': 'application/json'
}
}}
>
{children}
</IntrigLayout>
</body>
</html>
);
}

Configuration Options

IntrigLayout accepts a configs prop for client-side configuration:

PropertyTypeDescription
baseURLstringBase URL for client-side API requests
timeoutnumberRequest timeout in milliseconds
headersRecord<string, string>Default headers for client requests
requestInterceptorfunctionRequest preprocessing function
responseInterceptorfunctionResponse postprocessing function

Complete configuration options documented in IntrigLayout API Reference.


Server-Side Configuration

Server functions use environment variables for configuration.

Environment Variables

# .env.local
DEFAULT_API_URL=https://api.yourservice.com
USERS_API_URL=https://users-api.example.com
ANALYTICS_API_URL=https://analytics.example.com

Environment Variable Naming

  • Pattern: {SOURCE_ID}_API_URL (uppercase)
  • Example: For source userApiUSERAPI_API_URL
  • Fallback: DEFAULT_API_URL when source-specific URL not provided

Middleware Configuration

Configure middleware for authentication and header injection:

// middleware.ts
import { createIntrigMiddleware } from '@intrig/next';

export const middleware = createIntrigMiddleware(async (request) => {
return {
'Authorization': `Bearer ${process.env.API_TOKEN}`,
'X-User-ID': request.headers.get('x-user-id') || ''
};
});

export const config = {
matcher: '/api/:path*'
};

Middleware runs before API routes and server components, enabling centralized request preprocessing.


Post-Initialization Steps

After initialization and configuration:

1. Configure API Sources

Add OpenAPI specification sources:

intrig sources add

Interactive prompts request:

  • Source identifier (camelCase, e.g., userApi)
  • OpenAPI specification URL

2. Synchronize Specifications

Fetch OpenAPI specifications:

intrig sync --all

3. Generate SDK

Generate type-safe server functions and client hooks:

intrig generate

4. Use Generated Code

Server-side:

// app/api/users/route.ts
import { getUserAction } from '@intrig/next/userApi/users/getUser/action';

export async function GET() {
const user = await getUserAction({ id: '123' });
return Response.json(user);
}

Client-side:

// components/UserProfile.tsx
'use client';
import { useGetUser } from '@intrig/next/userApi/users/getUser/client';

export function UserProfile({ userId }: { userId: string }) {
const [userState, getUser] = useGetUser({
fetchOnMount: true,
params: { id: userId }
});
// Implementation
}

Verification

Confirm successful initialization:

# Verify configuration exists
cat intrig.config.json

# Check Intrig CLI accessibility
intrig --version

# Verify gitignore updates
grep "# Intrig" .gitignore

# Test SDK generation
intrig generate

Configuration Management

Environment-Specific Settings

Use environment variables for deployment-specific configuration:

Client-side (requires NEXT_PUBLIC_ prefix):

<IntrigLayout
configs={{
baseURL: process.env.NEXT_PUBLIC_API_URL || 'http://localhost:3000',
timeout: parseInt(process.env.NEXT_PUBLIC_TIMEOUT || '5000')
}}
>
{children}
</IntrigLayout>

Server-side (no prefix required):

# .env.local
USERAPI_API_URL=https://api.example.com
API_TOKEN=your-secret-token

Dynamic Configuration

Update configuration based on runtime conditions:

// app/layout.tsx
export default function RootLayout({ children }: { children: ReactNode }) {
const isDevelopment = process.env.NODE_ENV === 'development';

const configs = {
baseURL: isDevelopment
? 'http://localhost:3000'
: process.env.NEXT_PUBLIC_API_URL,
timeout: isDevelopment ? 30000 : 5000
};

return (
<IntrigLayout configs={configs}>
{children}
</IntrigLayout>
);
}

Troubleshooting

Configuration File Not Created

Symptom: intrig.config.json missing after initialization

Resolution:

  • Confirm current directory contains package.json
  • Verify write permissions in project directory
  • Run intrig init from project root

Wrong Generator Configured

Symptom: Generated code incompatible with Next.js

Resolution:

  • Manually edit intrig.config.json and set "generator": "next"
  • Regenerate SDK with intrig generate

Environment Variables Not Found

Symptom: Server functions fail with missing URL error

Resolution:

  • Verify environment variables in .env.local
  • Check naming matches pattern: {SOURCE_ID}_API_URL
  • Restart development server after adding variables

IntrigLayout Not Found

Symptom: Import error for IntrigLayout

Resolution:

  • Verify @intrig/next installation: npm list @intrig/next
  • Reinstall if missing: npm install @intrig/next
  • Check import path: import { IntrigLayout } from '@intrig/next';