import { BaseChunker } from './base';
import { MetadataChunk, Reference } from './types';
export class CustomObjectChunker extends BaseChunker {
chunkMetadata(metadata: any): MetadataChunk[] {
const chunks: MetadataChunk[] = [];
// Create object overview chunk
const objectChunk = this.createObjectOverviewChunk(metadata);
if (objectChunk) {
chunks.push(objectChunk);
}
// Create chunks for each field
if (metadata.fields) {
metadata.fields.forEach((field: any, index: number) => {
const fieldChunk = this.createFieldChunk(metadata, field, index);
if (fieldChunk) {
chunks.push(fieldChunk);
}
});
}
// Create chunks for validation rules
if (metadata.validationRules) {
metadata.validationRules.forEach((rule: any, index: number) => {
const ruleChunk = this.createValidationRuleChunk(metadata, rule, index);
if (ruleChunk) {
chunks.push(ruleChunk);
}
});
}
return chunks;
}
private createObjectOverviewChunk(metadata: any): MetadataChunk | null {
const objectName = metadata.fullName || metadata.name || 'Unknown';
const content = [
`Object: ${objectName}`,
metadata.label ? `Label: ${metadata.label}` : '',
metadata.description ? `Description: ${metadata.description}` : '',
metadata.sharingModel ? `Sharing Model: ${metadata.sharingModel}` : '',
metadata.deploymentStatus ? `Deployment Status: ${metadata.deploymentStatus}` : ''
].filter(Boolean).join('\n');
const symbols = [objectName];
const references: Reference[] = [{
type: 'object',
name: objectName,
fullName: objectName
}];
return this.createBaseChunk(
objectName,
content,
'object_overview',
symbols,
references
);
}
private createFieldChunk(metadata: any, field: any, index: number): MetadataChunk | null {
const objectName = metadata.fullName || metadata.name || 'Unknown';
const fieldName = field.fullName || field.name || `field_${index}`;
let content = [
`Field: ${objectName}.${fieldName}`,
field.label ? `Label: ${field.label}` : '',
field.type ? `Type: ${field.type}` : '',
field.description ? `Description: ${field.description}` : '',
field.required ? 'Required: true' : '',
field.unique ? 'Unique: true' : '',
field.formula ? `Formula: ${field.formula}` : '',
field.defaultValue ? `Default: ${field.defaultValue}` : ''
].filter(Boolean).join('\n');
// Add picklist values if it's a picklist field
if (field.type === 'Picklist' && field.valueSet && field.valueSet.valueSetDefinition) {
const picklistValues = field.valueSet.valueSetDefinition.value
?.map((v: any) => v.fullName || v.label)
.join(', ');
if (picklistValues) {
content += `\nPicklist Values: ${picklistValues}`;
}
}
const symbols = [objectName, fieldName, `${objectName}.${fieldName}`];
const references: Reference[] = [
{
type: 'object',
name: objectName,
fullName: objectName
},
{
type: 'field',
name: fieldName,
fullName: `${objectName}.${fieldName}`,
context: objectName
}
];
// Add relationship references
if (field.referenceTo && field.referenceTo.length > 0) {
field.referenceTo.forEach((refObject: string) => {
symbols.push(refObject);
references.push({
type: 'object',
name: refObject,
fullName: refObject,
context: 'relationship'
});
});
}
return this.createBaseChunk(
fieldName,
content,
`field_${index}_${fieldName}`,
symbols,
references
);
}
private createValidationRuleChunk(metadata: any, rule: any, index: number): MetadataChunk | null {
const objectName = metadata.fullName || metadata.name || 'Unknown';
const ruleName = rule.fullName || rule.name || `rule_${index}`;
const content = [
`Validation Rule: ${objectName}.${ruleName}`,
rule.description ? `Description: ${rule.description}` : '',
rule.errorConditionFormula ? `Formula: ${rule.errorConditionFormula}` : '',
rule.errorMessage ? `Error Message: ${rule.errorMessage}` : '',
rule.active ? 'Active: true' : 'Active: false'
].filter(Boolean).join('\n');
const symbols = this.extractBasicSymbols(content);
symbols.push(objectName, ruleName);
const references = this.extractBasicReferences(content);
references.push({
type: 'object',
name: objectName,
fullName: objectName
});
return this.createBaseChunk(
ruleName,
content,
`validation_rule_${index}_${ruleName}`,
symbols,
references
);
}
}