This is a comprehensive reference for @514labs/moose-lib, detailing all exported components, types, and utilities.
KeyA type for marking fields as primary keys in data models.
// Exampleinterface MyModel { id: Key<string>; // Marks 'id' as a primary key of type string}JWTA type for working with JSON Web Tokens.
// Exampletype UserJWT = JWT<{ userId: string, role: string }>;ApiUtilInterface providing utilities for analytics APIs.
interface ApiUtil { client: MooseClient; // Client for interacting with the database sql: typeof sql; // SQL template tag function jwt: JWTPayload | undefined; // Current JWT if available}BaseModelNot applicable in TypeScript - use TypeScript interfaces instead.
Not applicable in TypeScript - use TypeScript interfaces instead.
Client for interacting with ClickHouse and Temporal.
class MooseClient { query: QueryClient; // For database queries workflow: WorkflowClient; // For workflow operations}Not applicable in TypeScript - APIs return values directly.
Base configuration interface for OlapTable with common table configuration options.
interface BaseOlapConfig<T> { // Optional database name (defaults to moose.config.toml clickhouse_config.db_name) database?: string; // Optional array of field names to order by orderByFields?: (keyof T & string)[]; // Optional SQL expression for ORDER BY clause (alternative to orderByFields) orderByExpression?: string; // Optional table engine (defaults to MergeTree) engine?: ClickHouseEngines; // Optional settings for table configuration settings?: { [key: string]: string }; // Optional lifecycle mode (defaults to MOOSE_MANAGED) lifeCycle?: LifeCycle; // Additional engine-specific fields (ver, isDeleted, keeperPath, etc.) // depend on the engine type}Creates a ClickHouse table with the schema of type T.
// Basic usage with MergeTree (default)export const myTable = new OlapTable<UserProfile>("user_profiles"); // With sorting configuration (fields)export const myConfiguredTable = new OlapTable<UserProfile>("user_profiles", { orderByFields: ["id", "timestamp"]}); // With sorting configuration (expression)export const myConfiguredTableExpr = new OlapTable<UserProfile>("user_profiles_expr", { // Equivalent to orderByFields: ["id", "timestamp"] orderByExpression: "(id, timestamp)"}); // Disable sorting entirelyexport const myUnsortedTable = new OlapTable<UserProfile>("user_profiles_unsorted", { orderByExpression: "tuple()"}); // For deduplication, explicitly set the ReplacingMergeTree engineexport const dedupTable = new OlapTable<UserProfile>("user_profiles", { engine: ClickHouseEngines.ReplacingMergeTree, orderByFields: ["id", "timestamp"], ver: "updated_at", // Optional: version column for keeping latest isDeleted: "deleted" // Optional: soft delete marker (requires ver)});Creates a Redpanda topic with the schema of type T.
// Basic usageexport const myStream = new Stream<UserEvent>("user_events"); // With configurationexport const myConfiguredStream = new Stream<UserEvent>("user_events", { parallelism: 3, retentionPeriod: 86400 // 1 day in seconds}); // Adding transformationsmyConfiguredStream.addTransform( destinationStream, (record) => transformFunction(record));Creates an HTTP endpoint for ingesting data of type T.
// Basic usage with destination streamexport const myIngestApi = new IngestApi<UserEvent>("user_events", { destination: myUserEventStream});Creates an HTTP endpoint for querying data with request type T and response type R.
// Basic usageexport const myApi = new Api<UserQuery, UserProfile[]>( "getUserProfiles", async (params, { client, sql }) => { const result = await client.query.execute( sql`SELECT * FROM user_profiles WHERE age > ${params.minAge} LIMIT 10` ); return result; });Combines ingest API, stream, and table creation in a single component.
// Basic usageexport const pipeline = new IngestPipeline<UserEvent>("user_pipeline", { ingestApi: true, stream: true, table: true}); // With advanced configurationexport const advancedPipeline = new IngestPipeline<UserEvent>("advanced_pipeline", { ingestApi: true, stream: { parallelism: 3 }, table: { orderByFields: ["id", "timestamp"] }});Creates a materialized view in ClickHouse.
// Basic usageexport const view = new MaterializedView<UserStatistics>({ selectStatement: "SELECT user_id, COUNT(*) as event_count FROM user_events GROUP BY user_id", tableName: "user_events", materializedViewName: "user_statistics", orderByFields: ["user_id"]});Template tag for creating type-safe SQL queries with parameters.
// Basic usageconst query = sql`SELECT * FROM users WHERE id = ${userId}`; // With multiple parametersconst query = sql` SELECT * FROM users WHERE age > ${minAge} AND country = ${country} LIMIT ${limit}`;ClickHouseEngines EnumAvailable table engines:
enum ClickHouseEngines { MergeTree = "MergeTree", ReplacingMergeTree = "ReplacingMergeTree", AggregatingMergeTree = "AggregatingMergeTree", SummingMergeTree = "SummingMergeTree", ReplicatedMergeTree = "ReplicatedMergeTree", ReplicatedReplacingMergeTree = "ReplicatedReplacingMergeTree", ReplicatedAggregatingMergeTree = "ReplicatedAggregatingMergeTree", ReplicatedSummingMergeTree = "ReplicatedSummingMergeTree", S3Queue = "S3Queue"}ReplacingMergeTreeConfig<T>Configuration for ReplacingMergeTree tables:
type ReplacingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplacingMergeTree; orderByFields?: (keyof T & string)[]; ver?: keyof T & string; // Optional: version column for keeping latest isDeleted?: keyof T & string; // Optional: soft delete marker (requires ver) settings?: { [key: string]: string };}Configuration for replicated table engines:
// ReplicatedMergeTreetype ReplicatedMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };} // ReplicatedReplacingMergeTreetype ReplicatedReplacingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedReplacingMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) ver?: keyof T & string; // Optional: version column isDeleted?: keyof T & string; // Optional: soft delete marker orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };} // ReplicatedAggregatingMergeTreetype ReplicatedAggregatingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedAggregatingMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };} // ReplicatedSummingMergeTreetype ReplicatedSummingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedSummingMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) columns?: string[]; // Optional: columns to sum orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };}ClickHouseEngines EnumAvailable table engines:
enum ClickHouseEngines { MergeTree = "MergeTree", ReplacingMergeTree = "ReplacingMergeTree", AggregatingMergeTree = "AggregatingMergeTree", SummingMergeTree = "SummingMergeTree", ReplicatedMergeTree = "ReplicatedMergeTree", ReplicatedReplacingMergeTree = "ReplicatedReplacingMergeTree", ReplicatedAggregatingMergeTree = "ReplicatedAggregatingMergeTree", ReplicatedSummingMergeTree = "ReplicatedSummingMergeTree", S3Queue = "S3Queue"}ReplacingMergeTreeConfig<T>Configuration for ReplacingMergeTree tables:
type ReplacingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplacingMergeTree; orderByFields?: (keyof T & string)[]; ver?: keyof T & string; // Optional: version column for keeping latest isDeleted?: keyof T & string; // Optional: soft delete marker (requires ver) settings?: { [key: string]: string };}Configuration for replicated table engines:
// ReplicatedMergeTreetype ReplicatedMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };} // ReplicatedReplacingMergeTreetype ReplicatedReplacingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedReplacingMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) ver?: keyof T & string; // Optional: version column isDeleted?: keyof T & string; // Optional: soft delete marker orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };} // ReplicatedAggregatingMergeTreetype ReplicatedAggregatingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedAggregatingMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };} // ReplicatedSummingMergeTreetype ReplicatedSummingMergeTreeConfig<T> = { engine: ClickHouseEngines.ReplicatedSummingMergeTree; keeperPath?: string; // Optional: ZooKeeper/Keeper path (omit for Cloud) replicaName?: string; // Optional: replica name (omit for Cloud) columns?: string[]; // Optional: columns to sum orderByFields?: (keyof T & string)[]; settings?: { [key: string]: string };}A class that represents a single task within a workflow system.
// No input, no outputexport const task1 = new Task<null, void>("task1", { run: async () => { console.log("No input/output"); }, retries: 3, timeout: "30s"}); // With input and outputexport const task2 = new Task<InputType, OutputType>("task2", { run: async (ctx) => { return process(ctx.input); }, onComplete: [nextTask]});Configuration options for tasks.
interface TaskConfig<T, R> { // The main function that executes the task logic run: (context: TaskContext<T>) => Promise<R>; // Optional array of tasks to execute after this task completes onComplete?: (Task<R extends void ? null : R, any> | Task<R extends void ? null : R, void>)[]; // Optional function that is called when the task is cancelled. onCancel?: (context: TaskContext<T>) => Promise<void>; // Optional timeout duration (e.g., "30s", "5m", "never") timeout?: string; // Optional number of retry attempts retries?: number;}A class that represents a complete workflow composed of interconnected tasks.
const myWorkflow = new Workflow("getData", { startingTask: callAPI, schedule: "@every 5s", // Run every 5 seconds timeout: "1h", retries: 3});Configuration options for defining a workflow.
interface WorkflowConfig { // The initial task that begins the workflow execution startingTask: Task<null, any> | Task<null, void> | Task<any, any> | Task<any, void>; // Optional number of retry attempts retries?: number; // Optional timeout duration (e.g., "10m", "1h", "never") timeout?: string; // Optional cron-style schedule string schedule?: string;}Ensure your Infrastructure Components is correctly exported from your app/index.ts file.
Example: export { myTable, myStream, myApi, myWorkflow, myTask, myPipeline, myView }
Learn more about export pattern: local development / hosted.
Important: The following components must be exported from your app/index.ts (TypeScript) or imported into main.py (Python) for Moose to detect them:
OlapTable instancesStream instancesIngestApi instancesApi instancesIngestPipeline instancesMaterializedView instancesTask instancesWorkflow instancesConfiguration objects and utilities (like DeadLetterQueue, Key, sql) do not need to be exported as they are used as dependencies of the main components.
Note: The keeperPath and replicaName parameters are optional. When omitted, Moose uses smart defaults that work in both ClickHouse Cloud and self-managed environments (default path: /clickhouse/tables/{uuid}/{shard} with replica {replica}). You can still provide both parameters explicitly if you need custom replication paths.
Note: The keeperPath and replicaName parameters are optional. When omitted, Moose uses smart defaults that work in both ClickHouse Cloud and self-managed environments (default path: /clickhouse/tables/{uuid}/{shard} with replica {replica}). You can still provide both parameters explicitly if you need custom replication paths.