Skip to content

Commit dbb0125

Browse files
Copilothotlong
andcommitted
fix: address code review - use encoded keys and deduplicate dependencies
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
1 parent 6b665cc commit dbb0125

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

packages/metadata/src/metadata-manager.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ export class MetadataManager implements IMetadataService {
449449
// ==========================================
450450

451451
private overlayKey(type: string, name: string, scope: string = 'platform'): string {
452-
return `${type}:${name}:${scope}`;
452+
return `${encodeURIComponent(type)}:${encodeURIComponent(name)}:${scope}`;
453453
}
454454

455455
/**
@@ -704,7 +704,7 @@ export class MetadataManager implements IMetadataService {
704704
* Get metadata items that this item depends on
705705
*/
706706
async getDependencies(type: string, name: string): Promise<MetadataDependency[]> {
707-
return this.dependencies.get(`${type}:${name}`) ?? [];
707+
return this.dependencies.get(`${encodeURIComponent(type)}:${encodeURIComponent(name)}`) ?? [];
708708
}
709709

710710
/**
@@ -725,13 +725,20 @@ export class MetadataManager implements IMetadataService {
725725
/**
726726
* Register a dependency between two metadata items.
727727
* Used internally to track cross-references.
728+
* Duplicate dependencies (same source, target, and kind) are ignored.
728729
*/
729730
addDependency(dep: MetadataDependency): void {
730-
const key = `${dep.sourceType}:${dep.sourceName}`;
731+
const key = `${encodeURIComponent(dep.sourceType)}:${encodeURIComponent(dep.sourceName)}`;
731732
if (!this.dependencies.has(key)) {
732733
this.dependencies.set(key, []);
733734
}
734-
this.dependencies.get(key)!.push(dep);
735+
const existing = this.dependencies.get(key)!;
736+
const isDuplicate = existing.some(
737+
d => d.targetType === dep.targetType && d.targetName === dep.targetName && d.kind === dep.kind
738+
);
739+
if (!isDuplicate) {
740+
existing.push(dep);
741+
}
735742
}
736743

737744
// ==========================================

packages/metadata/src/metadata-service.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,5 +590,22 @@ describe('MetadataManager — IMetadataService Contract', () => {
590590
expect(await manager.getDependencies('object', 'nonexistent')).toEqual([]);
591591
expect(await manager.getDependents('object', 'nonexistent')).toEqual([]);
592592
});
593+
594+
it('should not add duplicate dependencies', () => {
595+
const dep = {
596+
sourceType: 'view',
597+
sourceName: 'account_list',
598+
targetType: 'object',
599+
targetName: 'account',
600+
kind: 'reference' as const,
601+
};
602+
603+
manager.addDependency(dep);
604+
manager.addDependency(dep);
605+
606+
// Should only have one entry
607+
const deps = manager.getDependencies('view', 'account_list');
608+
return deps.then(result => expect(result).toHaveLength(1));
609+
});
593610
});
594611
});

0 commit comments

Comments
 (0)