120 lines
3.2 KiB
TypeScript
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);
|
|
}
|