# DGM Interview with Sang
## Implementation Challenge: Data Conversion
You're migrating data from one CMS to another, and the origin CMS stores a page layout with a type like this:
```typescript=
interface SrcComponentInstance {
// the name of the target component
name: string;
// arguments given to the component
args: {
// name of the argument
name: string;
// value of the argument
value: JSONValue;
}[];
// the contents of the component
contents: (SrcComponentInstance | string)[];
};
```
The target CMS uses a different approach, giving a unique identifier to every single component and text snippet and using those references.
```typescript=
type Language = 'eng' | 'fra' | 'spa';
interface DestComponentInstance {
// unique identifier for this component
id: Id;
// the name of the target component
name: string;
// the arugements given to the component
args: {[k in string]?: JSONValue};
// the ids of each child instance of the component
contents: Id[];
};
interface DestTextInstance {
// unique identifier for this text
id: Id;
// the content text, depending on the language
content: {[k in Language]?: string};
};
```
Write a function that converts a list of top level `SrcComponentInstance`s to `DestComponentInstance`s:
```typescript=
const migrateComponent = (src: SrcComponentInstance[]): {[id in Id]?: DestComponentInstance} => {
return src.map((srcInstance: SrcComponentInstance) => {
// convert the parent component
let destInstance: DestComponentInstance = {
id: uuid(),
name: srcInstance.name,
args: JSON.parse(JSON.stringify(srcInstance.args)),
};
// convert string contents
const stringIds = srcInstance.contents.filter((content: SrcComponentInstance | string) => {
return typeof content === 'string'
}).map((content: string) => {
// register DestTextInstance component in db
let destTextInstance: DestTextInstance = {
id: uuid(),
content: content
};
return destTextInstance.id;
}
// filter child components and convert them
let childComponents: SrcComponentInstance[] = srcInstance.contents.filter((content: SrcComponentInstance | string) => {
return typeof content !== 'string';
});
const childIds = migrateComponent(childComponents);
destInstance.contents = [...childIds, ...stringIds];
// register destInstance component in db
return destInstance.id;
});
}
const convert = (src: SrcComponentInstance[]): {[id in Id]?: DestComponentInstance} => {
return migrateComponent(src);
}
```