wip-backup-manager
Version:
This utility enables backup & restore of Kentico Kontent projects
84 lines (72 loc) • 3.04 kB
text/typescript
import { IImportItemResult, ValidImportContract, ValidImportModel } from './core.models';
export class IdTranslateHelper {
public replaceIdReferencesWithNewId(
data: any,
items: IImportItemResult<ValidImportContract, ValidImportModel>[],
): void {
if (data) {
if (Array.isArray(data)) {
for (const arrayItem of data) {
this.replaceIdReferencesWithNewId(arrayItem, items);
}
} else {
for (const key of Object.keys(data)) {
const val = (data as any)[key];
if (typeof val === 'string' && val.startsWith('<') && val.endsWith('>')) {
// replace string with updated one
const newData = this.replaceIdsInRichText(val, items);
data[key] = newData;
}
if (key.toLowerCase() === 'id') {
const id = (data as any).id;
const newId = this.tryFindNewId(id, items);
if (newId) {
data.id = newId;
}
}
if (typeof val === 'object' && val !== null) {
this.replaceIdReferencesWithNewId(val, items);
}
}
}
}
}
private replaceIdsInRichText(
text: string,
items: IImportItemResult<ValidImportContract, ValidImportModel>[]
): string {
const itemId = { regex: /data-item-id=\"(.*?)\"/g, attr: 'data-item-id' };
const assetId = { regex: /data-asset-id=\"(.*?)\"/g, attr: 'data-asset-id' };
const imageId = { regex: /data-image-id=\"(.*?)\"/g, attr: 'data-image-id' };
const dataId = { regex: /data-id=\"(.*?)\"/g, attr: 'data-id' };
text = this.replaceTextWithRegex(itemId.regex, text, itemId.attr, items);
text = this.replaceTextWithRegex(assetId.regex, text, assetId.attr, items);
text = this.replaceTextWithRegex(imageId.regex, text, imageId.attr, items);
text = this.replaceTextWithRegex(dataId.regex, text, dataId.attr, items);
return text;
}
private replaceTextWithRegex(
regex: RegExp,
text: string,
replaceAttr: string,
items: IImportItemResult<ValidImportContract, ValidImportModel>[]
): string {
return text.replace(regex, (a, b) => {
if (b) {
const newId = this.tryFindNewId(b, items);
if (newId) {
return `${replaceAttr}="${newId}"`;
}
}
return a;
});
}
private tryFindNewId(
id: string,
items: IImportItemResult<ValidImportContract, ValidImportModel>[]
): string | undefined {
const item = items.find(m => m.originalId === id);
return item?.importId;
}
}
export const idTranslateHelper = new IdTranslateHelper();