Files
suaveplan/packages/persistence/database/seed/src/builder/builder.ts
2026-05-27 23:47:53 +01:00

120 lines
3.2 KiB
TypeScript

import type {
SeedDataFactory,
SeedDefinition,
SeedEnvironment,
SeedRecord,
UpsertStrategy,
} from "../types/common.js";
import type { ISeedBuilder } from "./builder.types.js";
/**
* Fluent builder for SeedDefinition objects. Tracks which optional fields the
* caller has set so `build()` can omit unset fields entirely (no empty arrays,
* no empty strings, no `truncate: false` slipping through to the output).
*/
export class SeedBuilder implements ISeedBuilder {
private readonly _name: string;
private _table: string;
private _environments: SeedEnvironment[] = [];
private _dependencies: string[] = [];
private _data: SeedRecord[] | SeedDataFactory = [];
private _upsertStrategy: UpsertStrategy = "skip";
private _upsertKeys: string[] = [];
private _description = "";
private _priority = 0;
private _truncate = false;
constructor(name: string) {
this._name = name;
this._table = name;
}
table(table: string): this {
this._table = table;
return this;
}
environments(...envs: SeedEnvironment[]): this {
this._environments = envs;
return this;
}
dependsOn(...names: string[]): this {
this._dependencies = names;
return this;
}
data(records: SeedRecord[]): this {
this._data = records;
return this;
}
dataFactory(factory: SeedDataFactory): this {
this._data = factory;
return this;
}
upsert(strategy: UpsertStrategy, keys: string[]): this {
this._upsertStrategy = strategy;
this._upsertKeys = keys;
return this;
}
description(desc: string): this {
this._description = desc;
return this;
}
priority(p: number): this {
this._priority = p;
return this;
}
truncateFirst(enabled = true): this {
this._truncate = enabled;
return this;
}
build(): SeedDefinition {
const definition: {
name: string;
table: string;
environments?: SeedEnvironment[];
dependencies?: string[];
data: SeedRecord[] | SeedDataFactory;
upsertStrategy: UpsertStrategy;
upsertKeys?: string[];
description?: string;
priority: number;
truncate?: boolean;
} = {
name: this._name,
table: this._table,
data: this._data,
upsertStrategy: this._upsertStrategy,
priority: this._priority,
};
if (this._environments.length > 0) {
definition.environments = this._environments;
}
if (this._dependencies.length > 0) {
definition.dependencies = this._dependencies;
}
if (this._upsertKeys.length > 0) {
definition.upsertKeys = this._upsertKeys;
}
if (this._description.length > 0) {
definition.description = this._description;
}
if (this._truncate) {
definition.truncate = true;
}
return definition;
}
}
/** Convenience function for creating a SeedBuilder. */
export function defineSeed(name: string): SeedBuilder {
return new SeedBuilder(name);
}