Skip to main content

Complete Development Workflow

End-to-end integration workflow from backend API changes through SDK regeneration, type checking, and implementation. Documents the feedback loop between specification changes and compile-time validation.


Workflow Overview

The Intrig development workflow establishes a deterministic pipeline from API contract definition to type-safe frontend implementation:

Backend Change → Update Spec → Sync → Generate → Type Check → Fix → Implement

Each step provides immediate feedback, with breaking changes detected at compile time rather than runtime.


Initial Project Setup

One-Time Configuration

# 1. Install Intrig packages
npm install @intrig/core @intrig/react

# 2. Initialize configuration
intrig init

# 3. Add API sources
intrig sources add

# 4. Synchronize specifications
intrig sync --all

# 5. Generate SDK
intrig generate

# 6. Start daemon (optional, for Insight)
intrig daemon up

Result: Project configured with type-safe SDK ready for import.


Standard Development Cycle

Scenario: Implementing New Feature

Initial State: Backend exposes new endpoint via OpenAPI specification.

Step 1: Synchronize Specification

intrig sync --all

Fetches updated specification containing new endpoint definition.

Verification: Check .intrig/specs/{sourceId}-latest.json modification time.

Step 2: Regenerate SDK

intrig generate

Generates new hooks/functions for the added endpoint.

Verification: New imports available in node_modules/@intrig/{framework}.

Step 3: Discover Endpoint

Using Insight:

intrig insight

Search for endpoint by name, path, or operation ID. Review:

  • Type signature
  • Required parameters
  • Response structure
  • Example usage

Step 4: Implement Feature

import { useGetProducts } from '@intrig/react/productApi/products/getProducts/useGetProducts';
import { isSuccess, isError, isPending } from '@intrig/react';

function ProductList() {
const [productsState, getProducts] = useGetProducts({
fetchOnMount: true,
clearOnUnmount: true
});

if (isPending(productsState)) {
return <LoadingSpinner />;
}

if (isError(productsState)) {
return <ErrorDisplay error={productsState.error} />;
}

if (isSuccess(productsState)) {
return (
<ul>
{productsState.data.map(product => (
<li key={product.id}>{product.name}</li>
))}
</ul>
);
}

return null;
}

Result: Type-safe implementation with compile-time validation.


Handling Breaking Changes

Scenario: Backend Modifies Endpoint Contract

Backend removes phoneNumber field from User schema.

Step 1: Detect Change

# Sync updated specification
intrig sync --all

# Regenerate SDK
intrig generate

Step 2: Compilation Failure

TypeScript compiler reports errors at all usage sites:

const user = await getUser({ id: '123' });
console.log(user.phoneNumber);
// ^^^^^^^^^^^^^^^^
// Error: Property 'phoneNumber' does not exist on type 'User'

Feedback: Immediate, precise error location. No runtime discovery required.

Step 3: Fix Implementation

Update code to handle missing field:

const user = await getUser({ id: '123' });
// phoneNumber no longer available
console.log(user.email); // Alternative field

Step 4: Verify

npm run build
# or
tsc --noEmit

Result: Breaking change detected and resolved before deployment.


Parameter Change Workflow

Scenario: Endpoint Adds Required Parameter

Backend adds required organizationId parameter to getUsers endpoint.

Step 1: Sync and Generate

intrig sync --all && intrig generate

Step 2: Type Errors Surface

// Previous call
getUsers(); // Error: Missing required parameter 'organizationId'

// Updated call
getUsers({ organizationId: currentOrgId }); // Correct

Feedback: TypeScript enforces new parameter requirement at compile time.

Step 3: Update Call Sites

Search for all usages:

# Find all usages in codebase
grep -r "getUsers(" src/

Update each call site with required parameter.

Result: All integration points updated with compiler validation.


Response Schema Change Workflow

Scenario: Backend Modifies Response Structure

Backend changes products endpoint response from array to paginated object:

Before:

Product[]

After:

{
items: Product[];
page: number;
totalPages: number;
}

Step 1: Sync and Generate

intrig sync --all && intrig generate

Step 2: Type Errors Surface

const [productsState] = useGetProducts();

if (isSuccess(productsState)) {
// Error: productsState.data is not array
productsState.data.map(p => ...)
// ^^^
// Error: Property 'map' does not exist
}

Step 3: Fix Implementation

if (isSuccess(productsState)) {
const { items, page, totalPages } = productsState.data;
items.map(p => ...)
// Pagination handling with page, totalPages
}

Result: Structure change handled with compiler guidance.


operationId Change Workflow

Scenario: Backend Renames Operation

OpenAPI operationId changes from getUser to getUserById.

Step 1: Sync and Generate

intrig sync --all && intrig generate

Step 2: Import Failures

import { useGetUser } from '@intrig/react/userApi/users/getUser/useGetUser';
// ^^^^^^^^^^
// Error: Module not found

Hook name changed to useGetUserById.

Step 3: Update Imports

Search and replace:

# Find usages
grep -r "useGetUser" src/

# Update imports
import { useGetUserById } from '@intrig/react/userApi/users/getUserById/useGetUserById';

Alternative: Use Insight to search by path or method to find new hook name.

Result: Imports updated to match new operation identifier.


CI/CD Integration

Pipeline Configuration

# .github/workflows/ci.yml
jobs:
build:
steps:
- uses: actions/checkout@v3

- name: Install dependencies
run: npm install

- name: Sync API specifications
run: intrig sync --ci --all

- name: Generate SDK
run: intrig generate --ci

- name: Type check
run: tsc --noEmit

- name: Run tests
run: npm test

- name: Build
run: npm run build

Key Points:

  • Use --ci flag to avoid daemon dependency
  • Sync before generation
  • Type check validates API contract compliance
  • Breaking changes fail the build

Team Workflow

Backend Team

  1. Update OpenAPI specification for API changes
  2. Deploy specification to accessible URL
  3. Notify frontend team of changes
  4. (Optional) Provide changelog or migration guide

Frontend Team

  1. Run intrig sync --all && intrig generate
  2. Address TypeScript compilation errors
  3. Update implementations based on type changes
  4. Test changes locally
  5. Push updated code

Communication: Specification serves as the authoritative contract. No manual type coordination required.


Troubleshooting Common Workflows

Workflow: Imports Work but Types Are Wrong

Symptom: Imports succeed but runtime data doesn't match types

Cause: Specification out of sync with deployed backend

Resolution:

# Ensure specification URL points to current deployment
intrig sync --all --id affectedApi

# Regenerate
intrig generate

# Verify specification matches deployed API

Workflow: SDK Generation Fails

Symptom: intrig generate fails with errors

Cause: Invalid or incomplete specification

Resolution:

# Check specification validity
cat .intrig/specs/{sourceId}-latest.json

# Validate OpenAPI specification
npx @apidevtools/swagger-cli validate .intrig/specs/{sourceId}-latest.json

# Contact backend team if specification is invalid

Workflow: Daemon Shows Stale Endpoints

Symptom: Insight displays outdated documentation

Cause: Daemon not restarted after sync

Resolution:

intrig daemon restart

Best Practices

Regular Synchronization

Sync specifications at the start of each development session:

# Morning routine
git pull
npm install
intrig sync --all && intrig generate

Ensures local SDK matches current backend contracts.

Automated Synchronization

Add postinstall script:

{
"scripts": {
"postinstall": "intrig sync --all && intrig generate"
}
}

Automatically regenerates SDK after dependency installation.

Type-Check Frequently

Run type checking during development:

# Watch mode
tsc --noEmit --watch

Catch integration issues immediately.

Commit Specifications

Include synchronized specifications in version control:

git add .intrig/specs/
git commit -m "chore: sync API specifications"

Enables team collaboration and historical tracking.


Performance Optimization

Selective Synchronization

For large projects with multiple sources, sync selectively:

# Only sync changed source
intrig sync --id userApi

# Generate for all sources
intrig generate

Reduces synchronization time when only one API changes.

Parallel Development

Multiple developers can work independently:

  • Each runs local daemon on different port if needed
  • Specifications sync to shared version control
  • No coordination required beyond spec updates