Types API
This reference covers all TypeScript types and interfaces provided by mod-engine for building type-safe modification systems.
Core Configuration Types
ConfigSpec
The fundamental configuration interface that defines the entire system.
interface ConfigSpec {
readonly metrics: readonly string[];
readonly operations: readonly string[];
readonly attributes: readonly AttributeSchema[];
}
Example
const config: ConfigSpec = {
metrics: ["Health", "Damage", "Defense"] as const,
operations: ["sum", "multiply", "subtract"] as const,
attributes: [
{ key: "Rarity", kind: "enum", values: ["Common", "Epic"] as const },
] as const,
};
Attribute Schema Types
AttributeSchema
Base interface for all attribute definitions.
interface AttributeSchema {
readonly key: string;
readonly kind: "enum" | "number" | "boolean" | "string";
}
EnumAttributeSchema
Defines attributes with a fixed set of values.
interface EnumAttributeSchema {
readonly key: string;
readonly kind: "enum";
readonly values: readonly string[];
readonly cardinality?: "single" | "multi";
}
Example
{
key: "Rarity",
kind: "enum",
values: ["Common", "Rare", "Epic", "Legendary"] as const,
cardinality: "single" // default
}
{
key: "Tags",
kind: "enum",
values: ["Weapon", "Armor", "Accessory"] as const,
cardinality: "multi" // allows multiple values
}
NumberAttributeSchema
Defines numeric attributes with optional constraints.
interface NumberAttributeSchema {
readonly key: string;
readonly kind: "number";
readonly min?: number;
readonly max?: number;
readonly integer?: boolean;
}
Example
{
key: "Level",
kind: "number",
min: 1,
max: 100,
integer: true
}
{
key: "CritChance",
kind: "number",
min: 0,
max: 100
}
BooleanAttributeSchema
Defines true/false attributes.
interface BooleanAttributeSchema {
readonly key: string;
readonly kind: "boolean";
}
Example
{
key: "Enchanted",
kind: "boolean"
}
StringAttributeSchema
Defines text attributes with optional validation.
interface StringAttributeSchema {
readonly key: string;
readonly kind: "string";
readonly minLen?: number;
readonly maxLen?: number;
readonly pattern?: string;
}
Example
{
key: "ItemName",
kind: "string",
minLen: 1,
maxLen: 50,
pattern: "^[A-Za-z0-9 ]+$"
}
Item Types
ItemSpec
Complete item specification with attributes and modifiers.
interface ItemSpec<C extends ConfigSpec> {
readonly name?: string;
readonly attributes: Attributes<C>;
readonly modifiers: readonly Modifier<C>[];
}
Attributes
Type-safe attributes object based on configuration.
type Attributes<C extends ConfigSpec> = {
[K in AttrKeyOf<C>]?: AttrValueOf<C, K>;
};
Modifier
Individual modifier specification.
interface Modifier<C extends ConfigSpec> {
readonly metric: MetricOf<C>;
readonly operation: OperationOf<C>;
readonly value: number;
readonly conditions?: Condition<C>;
readonly stacking?: Stacking;
readonly priority?: number;
readonly source?: string;
}
Evaluation Types
EvaluationResult
Result of item evaluation with metrics and application trace.
interface EvaluationResult<C extends ConfigSpec> {
readonly metrics: Record<MetricOf<C>, number>;
readonly applied: readonly ModifierApplication<C>[];
}
ModifierApplication
Record of a modifier application with before/after values.
interface ModifierApplication<C extends ConfigSpec> {
readonly modifier: Modifier<C>;
readonly appliedValue: number;
readonly before: number;
readonly after: number;
readonly resultingValue: number; // deprecated alias for `after`
}
EvalContext
Context passed to operation implementations.
interface EvalContext<C extends ConfigSpec> {
readonly item: ItemSpec<C>;
readonly modifier: Modifier<C>;
readonly currentMetrics: Record<MetricOf<C>, number>;
}
Condition Types
Condition
Conditional logic for modifier application.
type Condition<C extends ConfigSpec> = SimpleCondition<C> | LogicalCondition<C>;
SimpleCondition
Basic attribute comparison conditions.
type SimpleCondition<C extends ConfigSpec> =
| { op: "eq"; attr: AttrKeyOf<C>; value: AttrValueOf<C, any> }
| { op: "gt" | "gte" | "lt" | "lte"; attr: AttrKeyOf<C>; value: number }
| { op: "in"; attr: AttrKeyOf<C>; values: AttrValueOf<C, any>[] }
| { op: "includes"; attr: AttrKeyOf<C>; value: AttrValueOf<C, any> };
LogicalCondition
Logical operators for combining conditions.
type LogicalCondition<C extends ConfigSpec> =
| { op: "and"; clauses: Condition<C>[] }
| { op: "or"; clauses: Condition<C>[] }
| { op: "not"; clause: Condition<C> };
Operation Types
OperationImpl
Function signature for operation implementations.
type OperationImpl<C extends ConfigSpec> = (
currentValue: number,
modifierValue: number,
context: EvalContext<C>
) => number;
OperationInfo
Operation with metadata.
interface OperationInfo<C extends ConfigSpec> {
readonly impl: OperationImpl<C>;
readonly precedence: number;
}
BuiltinOperation
Union of built-in operation names.
type BuiltinOperation = "sum" | "subtract" | "multiply";
Utility Types
MetricOf
Extracts metric names from configuration.
type MetricOf<C extends ConfigSpec> = C["metrics"][number];
Example
type Config = typeof myConfig;
type Metrics = MetricOf<Config>; // "Health" | "Damage" | "Defense"
OperationOf
Extracts operation names from configuration.
type OperationOf<C extends ConfigSpec> = C["operations"][number];
Example
type Operations = OperationOf<Config>; // "sum" | "multiply" | "pow"
AttrKeyOf
Extracts attribute keys from configuration.
type AttrKeyOf<C extends ConfigSpec> = C["attributes"][number]["key"];
Example
type AttributeKeys = AttrKeyOf<Config>; // "Rarity" | "Level" | "Enchanted"
AttrValueOf
Extracts attribute value type for a specific key.
type AttrValueOf<C extends ConfigSpec, K extends AttrKeyOf<C>> =
// Complex conditional type that returns the correct value type
Example
type RarityValue = AttrValueOf<Config, "Rarity">; // "Common" | "Rare" | "Epic"
type LevelValue = AttrValueOf<Config, "Level">; // number
type EnchantedValue = AttrValueOf<Config, "Enchanted">; // boolean
Validation Types
ValidationResult
Result of validation operations.
interface ValidationResult {
readonly ok: boolean;
readonly errors: ValidationError[];
}
ValidationError
Detailed validation error information.
interface ValidationError {
readonly message: string;
readonly path?: string;
readonly code?: string;
}
Stacking Types
Stacking
Modifier stacking behavior.
type Stacking = "stack" | "unique" | { uniqueBy: string };
"default"- All modifiers apply normally"unique"- Only one modifier per source applies
Serialization Types
SerializedData
Generic serialized data container.
interface SerializedData<T> {
readonly version: number;
readonly data: T;
}
Engine Types
Engine
Main engine interface with core functionality.
interface Engine<C extends ConfigSpec> {
builder(name?: string): Builder<C>;
evaluate(
item: ItemSpec<C>,
options?: { base?: Partial<Record<MetricOf<C>, number>> }
): EvaluationResult<C>;
validateItem(item: ItemSpec<C>): ValidationResult;
registerOperation?(
name: string,
impl: OperationImpl<C>,
options?: { precedence?: number }
): void;
}
Type Guards and Helpers
Type-Safe Attribute Access
function getAttributeValue<C extends ConfigSpec, K extends AttrKeyOf<C>>(
attributes: Attributes<C>,
key: K
): AttrValueOf<C, K> | undefined {
return attributes[key];
}
Builder Helpers
function applyAttributes<C extends ConfigSpec>(
builder: Builder<C>,
attributes: Partial<Attributes<C>>
): Builder<C> {
Object.entries(attributes).forEach(([key, value]) => {
if (value !== undefined) {
builder.set(key as AttrKeyOf<C>, value);
}
});
return builder;
}
Type Inference Examples
// Configuration inference
const config = defineConfig({
metrics: ["Health", "Damage"] as const,
operations: ["sum", "multiply"] as const,
attributes: [
{ key: "Rarity", kind: "enum", values: ["Common", "Epic"] as const },
] as const,
});
type Config = typeof config;
type Metrics = MetricOf<Config>; // "Health" | "Damage"
type Operations = OperationOf<Config>; // "sum" | "multiply"
type RarityValues = AttrValueOf<Config, "Rarity">; // "Common" | "Epic"
// Engine inference
const engine = createEngine(config);
type Engine = typeof engine; // Engine<Config>
// Builder inference
const builder = engine.builder("Test");
type Builder = typeof builder; // Builder<Config>
This type system ensures complete compile-time safety while maintaining flexibility for complex item modification systems.
Context added by Giga data-models - using core data model implementations, item specification model, and metric modifier model information.