Universal TypeScript types and services for ClickUp API integration. Shared across multiple projects with framework-specific implementations.
Included:
- Pure TypeScript types for ClickUp API v2 & v3
- Framework-agnostic OAuth protocol functions
- SvelteKit + Supabase integration
- Next.js App Router integration (placeholder)
Not included:
- Business logic
- Framework dependencies (peer dependencies only)
- Opinionated abstractions
clickup-utils/
βββ types/ # Pure TypeScript types
βββ core/ # Framework-agnostic OAuth protocol
βββ sveltekit/ # SvelteKit + Supabase services
βββ nextjs/ # Next.js services (placeholder)
As a git submodule:
git submodule add https://github.com/heyramzi/clickup-utils src/lib/types/clickup-utilsimport type { Task, ClickUpWorkspace, ClickUpList } from '$lib/types/clickup-utils'import { exchangeCodeForToken, buildAuthUrl } from 'clickup-utils/core/oauth-protocol'
const token = await exchangeCodeForToken({
clientId: 'your-client-id',
clientSecret: 'your-secret',
code: 'auth-code'
})
const authUrl = buildAuthUrl({
clientId: 'your-client-id',
redirectUri: 'https://yourapp.com/api/clickup/callback',
state: 'csrf-token'
})import { handleClickUpCallback } from 'clickup-utils/sveltekit/oauth.service'
import { ClickUpTokenStorage } from 'clickup-utils/sveltekit/token.service'
export const GET: RequestHandler = async (event) => {
await handleClickUpCallback(event, {
clientId: PUBLIC_CLICKUP_CLIENT_ID,
clientSecret: CLICKUP_CLIENT_SECRET,
onSuccess: async (token) => {
await ClickUpTokenStorage.save(
supabase,
organizationId,
token,
TokenEncryptionService
)
}
})
throw redirect(303, '/dashboard')
}See sveltekit/README.md for full examples.
import { handleClickUpCallback } from 'clickup-utils/nextjs/oauth.service'
export async function GET(request: NextRequest) {
await handleClickUpCallback(request, {
clientId: process.env.CLICKUP_CLIENT_ID!,
clientSecret: process.env.CLICKUP_CLIENT_SECRET!,
onSuccess: async (token) => {
// Store token in your database
}
})
return NextResponse.redirect('/dashboard')
}See nextjs/README.md for full examples.
// Types
import type { Task } from 'clickup-utils/types/clickup-task-types'
// Core
import { exchangeCodeForToken } from 'clickup-utils/core/oauth-protocol'
// SvelteKit
import { handleClickUpCallback } from 'clickup-utils/sveltekit/oauth.service'// All types available at root
import type { Task, ClickUpWorkspace } from 'clickup-utils'
// Framework services with suffix
import {
handleClickUpCallbackSvelteKit,
ClickUpTokenStorageSvelteKit
} from 'clickup-utils'Types:
- Reflect actual ClickUp API behavior
- Test across all consuming projects
- Keep transformers separate from core API types
Services:
- Keep framework-specific code in framework folders
- Extract truly shared logic to
core/ - No abstractions for abstractions' sake
- Provide clear usage examples