UNPKG

@dotcms/client

Version:

Official JavaScript library for interacting with DotCMS REST APIs.

253 lines (205 loc) 8.69 kB
# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview This is the **DotCMS Client SDK** (`@dotcms/client`) - a JavaScript/TypeScript library for interacting with DotCMS REST APIs. The SDK is part of a larger DotCMS monorepo and serves as the foundation for framework-specific integrations (React, Angular, etc.). ## Essential Commands ### Development Commands ```bash # Install dependencies (from monorepo root) yarn install # Build library for distribution nx run sdk-client:build # ESM/CJS dual package build nx run sdk-client:build:js # Specialized esbuild for editor integration # Run tests nx run sdk-client:test # Run Jest tests nx run sdk-client:test:ci # Run tests with CI configuration and coverage # Code quality nx run sdk-client:lint # ESLint code linting # Publishing nx run sdk-client:publish --args.ver=1.0.0 --args.tag=latest ``` ### Testing Commands ```bash # Run specific test file nx test sdk-client --testNamePattern="specific test name" # Run tests in watch mode nx test sdk-client --watch # Run tests with coverage nx test sdk-client --coverage ``` ## Architecture Overview ### Project Structure ``` libs/sdk/client/ ├── src/ │ ├── index.ts # Main export (createDotCMSClient) │ ├── internal.ts # Internal utilities for other SDKs │ └── lib/ │ ├── client/ │ │ ├── client.ts # Main DotCMSClient class │ │ ├── content/ # Content API with query builders │ │ ├── navigation/ # Navigation API │ │ ├── page/ # Page API with GraphQL support │ │ └── models/ # TypeScript interfaces and types │ └── utils/ │ └── graphql/ # GraphQL utilities ├── project.json # Nx project configuration ├── package.json # NPM package configuration ├── tsconfig.json # TypeScript configuration └── jest.config.ts # Jest testing configuration ``` ### Key Components **Core API Pattern**: The SDK follows a client-builder pattern with three main APIs: - `client.page.get()` - Fetches complete page content with layout and containers - `client.content.getCollection()` - Builder pattern for querying content collections - `client.navigation.get()` - Fetches site navigation structure **Build Targets**: - `build` - Standard library build producing ESM/CJS dual packages - `build:js` - Specialized esbuild for editor integration (outputs to `dotCMS/src/main/webapp/html/js/editor-js`) ## Development Standards ### TypeScript Configuration - **Strict mode enabled**: Full TypeScript strict checking - **Target**: ES2020 with lib support for ES2020, DOM, DOM.Iterable - **Dual package support**: ESM and CJS through Rollup build - **Type definitions**: `@dotcms/types` for comprehensive type safety ### Code Patterns #### Client Builder Pattern ```typescript // Main client initialization const client = createDotCMSClient({ dotcmsUrl: 'https://instance.com', authToken: 'token', siteId: 'site-id' }); // Page API - single request for complete page const { pageAsset } = await client.page.get('/about-us'); // Content API - fluent builder pattern const blogs = await client.content .getCollection('Blog') .query((qb) => qb.field('title').equals('dotCMS*')) .limit(10) .sortBy([{ field: 'publishDate', direction: 'desc' }]); ``` #### GraphQL Integration ```typescript // Extend page requests with GraphQL for additional content const { pageAsset, content } = await client.page.get('/about-us', { graphql: { page: `title vanityUrl { url }`, content: { blogs: `BlogCollection(limit: 3) { title urlTitle }`, navigation: `DotNavigation(uri: "/", depth: 2) { href title }` } } }); ``` #### Query Builder Pattern ```typescript // Fluent query building for content collections const query = await client.content .getCollection('Product') .query((qb) => qb .field('category').equals('electronics') .and() .field('price').raw(':[100 TO 500]') .not() .field('discontinued').equals('true') ) .limit(10) .page(1); ``` ### Testing Standards #### Jest Configuration - **Framework**: Jest with TypeScript support - **Coverage**: Outputs to `../../../coverage/libs/sdk/client` - **File patterns**: `**/*.spec.ts` and `**/*.test.ts` - **CI mode**: Supports CI configuration with coverage reporting #### Test Patterns ```typescript // Use descriptive test names and group related tests describe('DotCMSClient', () => { describe('page.get()', () => { it('should fetch page content with default options', async () => { // Test implementation }); it('should apply GraphQL extensions correctly', async () => { // Test implementation }); }); }); // Mock external dependencies jest.mock('../utils/fetch', () => ({ dotFetch: jest.fn() })); ``` ### Build System Integration #### Nx Monorepo Integration - **Executor**: `@nx/rollup:rollup` for main build, `@nx/esbuild:esbuild` for editor build - **Outputs**: Dual package (ESM/CJS) with proper export maps - **Dependencies**: Automatically managed through Nx dependency graph #### Export Configuration ```typescript // Package exports support both named and default imports export { createDotCMSClient } from './lib/client/client'; export type { DotCMSClient } from './lib/client/client'; // Internal exports for framework SDKs export { DotCMSClientImpl } from './lib/client/client-impl'; ``` ## Key Configuration Files - **project.json**: Nx project configuration with build targets - **package.json**: NPM package metadata with proper exports field - **tsconfig.json**: TypeScript configuration with strict mode - **tsconfig.lib.json**: Library-specific TypeScript settings - **jest.config.ts**: Jest testing configuration ## Development Workflow ### Standard Development Flow 1. **Make changes** → Test locally with `nx test sdk-client` 2. **Lint code**`nx lint sdk-client` 3. **Build library**`nx build sdk-client` 4. **Integration testing** → Test with dependent SDKs or examples ### Editor Integration Build For changes affecting the editor integration: 1. **Build editor version**`nx run sdk-client:build:js` 2. **Test in dotCMS editor** → Verify functionality in dotCMS admin 3. **Clean build artifacts** → Script automatically removes temporary files ### Release Process 1. **Version bump** → Update version in `package.json` 2. **Build all targets**`nx build sdk-client` 3. **Publish**`nx run sdk-client:publish --args.ver=X.X.X --args.tag=latest` ## Integration Context ### Framework SDKs This client SDK serves as the foundation for: - `@dotcms/react` - React integration with UVE support - `@dotcms/angular` - Angular integration with UVE support - `@dotcms/uve` - Universal Visual Editor low-level integration ### Dependencies - **Runtime**: `consola` for logging - **Development**: `@dotcms/types` for TypeScript definitions - **Peer Dependencies**: Framework-specific SDKs extend this client ## Common Development Tasks ### Adding New API Methods 1. **Define interfaces** in `lib/client/models/` 2. **Implement method** in appropriate API class (`page/`, `content/`, `navigation/`) 3. **Export** from main `index.ts` 4. **Add tests** following existing patterns 5. **Update TypeScript types** if needed ### Extending Query Builders 1. **Add method** to appropriate builder class 2. **Update builder interface** with new method signature 3. **Add tests** for new query capabilities 4. **Document** in README with examples ### GraphQL Integration 1. **Define GraphQL fragments** in `utils/graphql/` 2. **Add to page API** GraphQL parameter types 3. **Test** with various GraphQL queries 4. **Update documentation** with new capabilities ## Summary Checklist - ✅ Use Nx commands for all build/test operations - ✅ Follow client-builder pattern for new APIs - ✅ Maintain TypeScript strict mode compliance - ✅ Write comprehensive Jest tests for new features - ✅ Use proper export patterns for dual package support - ✅ Test both ESM and CJS builds - ✅ Verify editor integration when making core changes - ❌ Avoid breaking changes to public API without migration plan - ❌ Don't add runtime dependencies without careful consideration