bryantgillespie / directus-sdk-typegen

MIT License
5 stars 1 forks source link

Directus SDK Types Generator

🚧 This is currently in development and the generated types are not perfect. 🚧

Opinionated CLI tool and library to generate TypeScript types from Directus collections to use with the Directus SDK.

Generates the individual interfaces for the Directus collections and a Schema type that collects all the interfaces together for use with the Directus SDK.

Example

Generate the types from the CLI.

npx directus-sdk-typegen -u http://localhost:8055 -t your-token-here -o ./my-schema.ts
// my-schema.ts
export interface Event {
    /** @required */
    id: string;
    status?: 'draft' | 'active' | 'past';
    sort?: number | null;
    user_created?: DirectusUser | string | null;
    date_created?: string | null;
    user_updated?: DirectusUser | string | null;
    date_updated?: string | null;
    /** @description Name of the event. @required */
    title: string;
    /** @required */
    slug: string;
    /** @description When does this event start? @required */
    start_at: string;
    /** @description When does this event end? */
    end_at?: string | null;
    /** @description Short description of the event. Used in SEO meta description. */
    description?: string | null;
    featured_image?: DirectusFile | string | null;
    timezone?: string | null;
    location?: 'whereby' | 'youtube' | 'other' | null;
    location_url?: string | null;
    location_youtube?: string | null;
    recording_url?: string | null;
    content?: string | null;
    location_whereby?: any | null;
    custom_registration_questions?: EventCustomRegistrationQuestion[] | string[];
    emails?: EventEmail[] | string[];
    feedback?: EventFeedback[] | string[];
    registrants?: EventRegistration[] | string[];
    hosts?: EventHost[] | string[];
}

export interface Schema {
    events: Event[]
}

Then use the generated types with the Directus SDK.

import type { Schema } from './my-schema';

import {
    createDirectus,
    rest
} from '@directus/sdk';

const directus = createDirectus<Schema>('http://localhost:8055').with(rest())

Installation

You can run the CLI tool using npx or install it globally.

npx directus-sdk-typegen -u http://localhost:8055 -t your-token-here -o ./my-schema.ts

or

npm install -g directus-sdk-typegen
directus-sdk-typegen -u http://localhost:8055 -t your-token-here -o ./my-schema.ts

Usage

You can use the Directus Type Generator as a CLI tool or as a library in your Node.js application.

CLI Usage

To generate TypeScript types from Directus collections, use the following command:

npx directus-sdk-typegen --url <DIRECTUS_API_URL> --token <DIRECTUS_API_TOKEN> --output <OUTPUT_FILE_PATH>

Options

Library Usage

You can also use the generator programmatically in your Node.js application:

// Output to a file
import { generateDirectusTypes } from 'directus-sdk-typegen';

async function generateTypes() {
    try {
        await generateDirectusTypes({
            outputPath: './my-schema.ts',
            directusUrl: 'http://localhost:8055',
            directusToken: 'your-token-here',
        });
    } catch (error) {
        console.error('Failed to generate types:', error);
    }
}

generateTypes();
// Return types as a variable
import { generateDirectusTypes } from 'directus-sdk-typegen';

async function generateTypes() {
    try {
        const types = await generateDirectusTypes({
            directusUrl: 'http://localhost:8055',
            directusToken: 'your-token-here',
        });
        // Do something else with the types
        console.log(types);
    } catch (error) {
        console.error('Failed to generate types:', error);
    }
}

Contributing

Happy to accept contributions that improve the types generated! But please open an issue first to discuss changes.

License

This project is licensed under the MIT License.