diff --git a/packages/contentstack-import/src/import/modules/variant-entries.ts b/packages/contentstack-import/src/import/modules/variant-entries.ts index 8dab1a88e6..2dd4f99390 100644 --- a/packages/contentstack-import/src/import/modules/variant-entries.ts +++ b/packages/contentstack-import/src/import/modules/variant-entries.ts @@ -1,5 +1,6 @@ import path from 'path'; import { Import, ImportHelperMethodsConfig, LogType, ProjectStruct } from '@contentstack/cli-variants'; +import { sanitizePath } from '@contentstack/cli-utilities'; import { ImportConfig, ModuleClassParams } from '../../types'; import { log, @@ -20,9 +21,9 @@ export default class ImportVarientEntries { this.config = importConfig; this.personalization = importConfig.modules.personalization; this.projectMapperFilePath = path.resolve( - this.config.data, + sanitizePath(this.config.data), 'mapper', - this.personalization.dirName, + sanitizePath(this.personalization.dirName), 'projects', 'projects.json', ); diff --git a/packages/contentstack-variants/src/export/attributes.ts b/packages/contentstack-variants/src/export/attributes.ts index 7fc32cb0d4..1c1192413b 100644 --- a/packages/contentstack-variants/src/export/attributes.ts +++ b/packages/contentstack-variants/src/export/attributes.ts @@ -1,6 +1,6 @@ import omit from 'lodash/omit'; import { resolve as pResolve } from 'node:path'; - +import { sanitizePath } from '@contentstack/cli-utilities'; import { formatError, fsUtil, PersonalizationAdapter, log } from '../utils'; import { PersonalizationConfig, ExportConfig, AttributesConfig, AttributeStruct } from '../types'; @@ -19,10 +19,10 @@ export default class ExportAttributes extends PersonalizationAdapter = []; const experienceToContentTypesMap: Record = {}; @@ -62,12 +63,12 @@ export default class ExportExperiences extends PersonalizationAdapter this.exportConfig = exportConfig; this.personalizationConfig = exportConfig.modules.personalization; this.projectFolderPath = path.resolve( - exportConfig.data, - exportConfig.branchName || '', - this.personalizationConfig.dirName, + sanitizePath(exportConfig.data), + sanitizePath(exportConfig.branchName || ''), + sanitizePath(this.personalizationConfig.dirName), 'projects', ); } @@ -35,7 +35,7 @@ export default class ExportProjects extends PersonalizationAdapter } this.exportConfig.personalizationEnabled = true; this.exportConfig.project_id = project[0]?.uid; - fsUtil.writeFile(path.resolve(this.projectFolderPath, 'projects.json'), project); + fsUtil.writeFile(path.resolve(sanitizePath(this.projectFolderPath), 'projects.json'), project); log(this.exportConfig, 'Project exported successfully!', 'success'); } catch (error) { log(this.exportConfig, `Failed to export projects!`, 'error'); diff --git a/packages/contentstack-variants/src/export/variant-entries.ts b/packages/contentstack-variants/src/export/variant-entries.ts index 6255c7bb65..a872544e44 100644 --- a/packages/contentstack-variants/src/export/variant-entries.ts +++ b/packages/contentstack-variants/src/export/variant-entries.ts @@ -1,6 +1,6 @@ import { existsSync, mkdirSync } from 'fs'; import { join, resolve } from 'path'; -import { FsUtility } from '@contentstack/cli-utilities'; +import { FsUtility, sanitizePath } from '@contentstack/cli-utilities'; import { APIConfig, AdapterType, ExportConfig, LogType } from '../types'; import VariantAdapter, { VariantHttpClient } from '../utils/variant-api-adapter'; @@ -25,7 +25,7 @@ export default class VariantEntries extends VariantAdapter { super(Object.assign(config, conf)); this.personalizationConfig = this.config.modules.personalization; this.attributeConfig = this.personalizationConfig.attributes; - this.mapperDirPath = resolve(this.config.backupDir, 'mapper', this.personalizationConfig.dirName); - this.attrMapperDirPath = resolve(this.mapperDirPath, this.attributeConfig.dirName); - this.attributesUidMapperPath = resolve(this.attrMapperDirPath, 'uid-mapping.json'); + this.mapperDirPath = resolve(sanitizePath(this.config.backupDir), 'mapper', sanitizePath(this.personalizationConfig.dirName)); + this.attrMapperDirPath = resolve(sanitizePath(this.mapperDirPath), sanitizePath(this.attributeConfig.dirName)); + this.attributesUidMapperPath = resolve(sanitizePath(this.attrMapperDirPath), 'uid-mapping.json'); this.attributesUidMapper = {}; } @@ -35,7 +35,7 @@ export default class Attribute extends PersonalizationAdapter { await fsUtil.makeDirectory(this.attrMapperDirPath); const { dirName, fileName } = this.attributeConfig; - const attributesPath = resolve(this.config.data, this.personalizationConfig.dirName, dirName, fileName); + const attributesPath = resolve(sanitizePath(this.config.data), sanitizePath(this.personalizationConfig.dirName), sanitizePath(dirName), sanitizePath(fileName)); if (existsSync(attributesPath)) { try { diff --git a/packages/contentstack-variants/src/import/audiences.ts b/packages/contentstack-variants/src/import/audiences.ts index b3351e513c..5812ad853a 100644 --- a/packages/contentstack-variants/src/import/audiences.ts +++ b/packages/contentstack-variants/src/import/audiences.ts @@ -1,6 +1,6 @@ import { resolve } from 'path'; import { existsSync } from 'fs'; - +import { sanitizePath } from '@contentstack/cli-utilities'; import { APIConfig, AudienceStruct, ImportConfig, LogType } from '../types'; import { PersonalizationAdapter, fsUtil, lookUpAttributes } from '../utils'; @@ -24,10 +24,10 @@ export default class Audiences extends PersonalizationAdapter { this.personalizationConfig = this.config.modules.personalization; this.audienceConfig = this.personalizationConfig.audiences; this.attributeConfig = this.personalizationConfig.attributes; - this.mapperDirPath = resolve(this.config.backupDir, 'mapper', this.personalizationConfig.dirName); - this.audienceMapperDirPath = resolve(this.mapperDirPath, this.audienceConfig.dirName); - this.audiencesUidMapperPath = resolve(this.audienceMapperDirPath, 'uid-mapping.json'); - this.attributesMapperPath = resolve(this.mapperDirPath, this.attributeConfig.dirName, 'uid-mapping.json'); + this.mapperDirPath = resolve(sanitizePath(this.config.backupDir), 'mapper', sanitizePath(this.personalizationConfig.dirName)); + this.audienceMapperDirPath = resolve(sanitizePath(this.mapperDirPath), sanitizePath(this.audienceConfig.dirName)); + this.audiencesUidMapperPath = resolve(sanitizePath(this.audienceMapperDirPath), 'uid-mapping.json'); + this.attributesMapperPath = resolve(sanitizePath(this.mapperDirPath), sanitizePath(this.attributeConfig.dirName), 'uid-mapping.json'); this.audiencesUidMapper = {}; } @@ -39,7 +39,7 @@ export default class Audiences extends PersonalizationAdapter { await fsUtil.makeDirectory(this.audienceMapperDirPath); const { dirName, fileName } = this.audienceConfig; - const audiencesPath = resolve(this.config.data, this.personalizationConfig.dirName, dirName, fileName); + const audiencesPath = resolve(sanitizePath(this.config.data), sanitizePath(this.personalizationConfig.dirName), sanitizePath(dirName), sanitizePath(fileName)); if (existsSync(audiencesPath)) { try { diff --git a/packages/contentstack-variants/src/import/events.ts b/packages/contentstack-variants/src/import/events.ts index 864a730b5a..d87d3b93fd 100644 --- a/packages/contentstack-variants/src/import/events.ts +++ b/packages/contentstack-variants/src/import/events.ts @@ -1,6 +1,6 @@ import { resolve } from 'path'; import { existsSync } from 'fs'; - +import { sanitizePath } from '@contentstack/cli-utilities'; import { PersonalizationAdapter, fsUtil } from '../utils'; import { APIConfig, EventStruct, ImportConfig, LogType } from '../types'; @@ -21,9 +21,9 @@ export default class Events extends PersonalizationAdapter { super(Object.assign(config, conf)); this.personalizationConfig = this.config.modules.personalization; this.eventsConfig = this.personalizationConfig.events; - this.mapperDirPath = resolve(this.config.backupDir, 'mapper', this.personalizationConfig.dirName); - this.eventMapperDirPath = resolve(this.mapperDirPath, this.eventsConfig.dirName); - this.eventsUidMapperPath = resolve(this.eventMapperDirPath, 'uid-mapping.json'); + this.mapperDirPath = resolve(sanitizePath(this.config.backupDir), 'mapper', sanitizePath(this.personalizationConfig.dirName)); + this.eventMapperDirPath = resolve(sanitizePath(this.mapperDirPath), sanitizePath(this.eventsConfig.dirName)); + this.eventsUidMapperPath = resolve(sanitizePath(this.eventMapperDirPath), 'uid-mapping.json'); this.eventsUidMapper = {}; } @@ -35,7 +35,7 @@ export default class Events extends PersonalizationAdapter { await fsUtil.makeDirectory(this.eventMapperDirPath); const { dirName, fileName } = this.eventsConfig; - const eventsPath = resolve(this.config.data, this.personalizationConfig.dirName, dirName, fileName); + const eventsPath = resolve(sanitizePath(this.config.data), sanitizePath(this.personalizationConfig.dirName), sanitizePath(dirName), sanitizePath(fileName)); if (existsSync(eventsPath)) { try { diff --git a/packages/contentstack-variants/src/import/experiences.ts b/packages/contentstack-variants/src/import/experiences.ts index 5060fb549e..2db2580e5b 100644 --- a/packages/contentstack-variants/src/import/experiences.ts +++ b/packages/contentstack-variants/src/import/experiences.ts @@ -2,7 +2,7 @@ import { join, resolve } from 'path'; import { existsSync } from 'fs'; import values from 'lodash/values'; import cloneDeep from 'lodash/cloneDeep'; - +import { sanitizePath } from '@contentstack/cli-utilities'; import { PersonalizationAdapter, fsUtil, lookUpAudiences, lookUpEvents } from '../utils'; import { APIConfig, ImportConfig, ExperienceStruct, CreateExperienceInput, LogType } from '../types'; @@ -46,30 +46,30 @@ export default class Experiences extends PersonalizationAdapter { super(Object.assign(config, conf)); this.personalizationConfig = this.config.modules.personalization; this.experiencesDirPath = resolve( - this.config.data, - this.personalizationConfig.dirName, - this.personalizationConfig.experiences.dirName, + sanitizePath(this.config.data), + sanitizePath(this.personalizationConfig.dirName), + sanitizePath(this.personalizationConfig.experiences.dirName), ); - this.experiencesPath = join(this.experiencesDirPath, this.personalizationConfig.experiences.fileName); + this.experiencesPath = join(sanitizePath(this.experiencesDirPath), sanitizePath(this.personalizationConfig.experiences.fileName)); this.experienceConfig = this.personalizationConfig.experiences; this.audienceConfig = this.personalizationConfig.audiences; - this.mapperDirPath = resolve(this.config.backupDir, 'mapper', this.personalizationConfig.dirName); - this.expMapperDirPath = resolve(this.mapperDirPath, this.experienceConfig.dirName); - this.experiencesUidMapperPath = resolve(this.expMapperDirPath, 'uid-mapping.json'); - this.cmsVariantGroupPath = resolve(this.expMapperDirPath, 'cms-variant-groups.json'); - this.cmsVariantPath = resolve(this.expMapperDirPath, 'cms-variants.json'); - this.audiencesMapperPath = resolve(this.mapperDirPath, this.audienceConfig.dirName, 'uid-mapping.json'); - this.eventsMapperPath = resolve(this.mapperDirPath, 'events', 'uid-mapping.json'); - this.failedCmsExpPath = resolve(this.expMapperDirPath, 'failed-cms-experience.json'); - this.failedCmsExpPath = resolve(this.expMapperDirPath, 'failed-cms-experience.json'); - this.experienceCTsPath = resolve(this.experiencesDirPath, 'experiences-content-types.json'); + this.mapperDirPath = resolve(sanitizePath(this.config.backupDir), 'mapper', sanitizePath(this.personalizationConfig.dirName)); + this.expMapperDirPath = resolve(sanitizePath(this.mapperDirPath), sanitizePath(this.experienceConfig.dirName)); + this.experiencesUidMapperPath = resolve(sanitizePath(this.expMapperDirPath), 'uid-mapping.json'); + this.cmsVariantGroupPath = resolve(sanitizePath(this.expMapperDirPath), 'cms-variant-groups.json'); + this.cmsVariantPath = resolve(sanitizePath(this.expMapperDirPath), 'cms-variants.json'); + this.audiencesMapperPath = resolve(sanitizePath(this.mapperDirPath), sanitizePath(this.audienceConfig.dirName), 'uid-mapping.json'); + this.eventsMapperPath = resolve(sanitizePath(this.mapperDirPath), 'events', 'uid-mapping.json'); + this.failedCmsExpPath = resolve(sanitizePath(this.expMapperDirPath), 'failed-cms-experience.json'); + this.failedCmsExpPath = resolve(sanitizePath(this.expMapperDirPath), 'failed-cms-experience.json'); + this.experienceCTsPath = resolve(sanitizePath(this.experiencesDirPath), 'experiences-content-types.json'); this.experienceVariantsIdsPath = resolve( - this.config.data, - this.personalizationConfig.dirName, - this.experienceConfig.dirName, + sanitizePath(this.config.data), + sanitizePath(this.personalizationConfig.dirName), + sanitizePath(this.experienceConfig.dirName), 'experiences-variants-ids.json', ); - this.variantUidMapperFilePath = resolve(this.expMapperDirPath, 'variants-uid-mapping.json'); + this.variantUidMapperFilePath = resolve(sanitizePath(this.expMapperDirPath), 'variants-uid-mapping.json'); this.experiencesUidMapper = {}; this.cmsVariantGroups = {}; this.cmsVariants = {}; @@ -77,7 +77,7 @@ export default class Experiences extends PersonalizationAdapter { this.expCheckIntervalDuration = this.experienceConfig?.checkIntervalDuration ?? 5000; this.maxValidateRetry = Math.round(this.expThresholdTimer / this.expCheckIntervalDuration); this.pendingVariantAndVariantGrpForExperience = []; - this.cTsSuccessPath = resolve(this.config.backupDir, 'mapper', 'content_types', 'success.json'); + this.cTsSuccessPath = resolve(sanitizePath(this.config.backupDir), 'mapper', 'content_types', 'success.json'); this.createdCTs = []; } diff --git a/packages/contentstack-variants/src/import/project.ts b/packages/contentstack-variants/src/import/project.ts index 7d12a29639..5de48e851f 100644 --- a/packages/contentstack-variants/src/import/project.ts +++ b/packages/contentstack-variants/src/import/project.ts @@ -1,6 +1,6 @@ import { join, resolve as pResolve } from 'path'; import { existsSync, readFileSync } from 'fs'; - +import { sanitizePath } from '@contentstack/cli-utilities'; import { PersonalizationAdapter, askProjectName, fsUtil } from '../utils'; import { APIConfig, CreateProjectInput, ImportConfig, LogType, ProjectStruct } from '../types'; @@ -14,9 +14,9 @@ export default class Project extends PersonalizationAdapter { }; super(Object.assign(config, conf)); this.projectMapperFolderPath = pResolve( - this.config.backupDir, + sanitizePath(this.config.backupDir), 'mapper', - this.config.modules.personalization.dirName, + sanitizePath(this.config.modules.personalization.dirName), 'projects', ); } @@ -28,7 +28,7 @@ export default class Project extends PersonalizationAdapter { async import() { const personalization = this.config.modules.personalization; const { dirName, fileName } = personalization.projects; - const projectPath = join(this.config.data, personalization.dirName, dirName, fileName); + const projectPath = join(sanitizePath(this.config.data), sanitizePath(personalization.dirName), sanitizePath(dirName), sanitizePath(fileName)); if (existsSync(projectPath)) { const projects = JSON.parse(readFileSync(projectPath, 'utf8')) as CreateProjectInput[]; @@ -60,7 +60,7 @@ export default class Project extends PersonalizationAdapter { this.config.modules.personalization.importData = true; await fsUtil.makeDirectory(this.projectMapperFolderPath); - fsUtil.writeFile(pResolve(this.projectMapperFolderPath, 'projects.json'), projectRes); + fsUtil.writeFile(pResolve(sanitizePath(this.projectMapperFolderPath), 'projects.json'), projectRes); this.log(this.config, `Project Created Successfully: ${projectRes.uid}`, 'info'); } } else { diff --git a/packages/contentstack-variants/src/import/variant-entries.ts b/packages/contentstack-variants/src/import/variant-entries.ts index f768c75b14..50e899c4bd 100644 --- a/packages/contentstack-variants/src/import/variant-entries.ts +++ b/packages/contentstack-variants/src/import/variant-entries.ts @@ -6,7 +6,7 @@ import forEach from 'lodash/forEach'; import indexOf from 'lodash/indexOf'; import { join, resolve } from 'path'; import { readFileSync, existsSync } from 'fs'; -import { FsUtility, HttpResponse } from '@contentstack/cli-utilities'; +import { FsUtility, HttpResponse, sanitizePath } from '@contentstack/cli-utilities'; import VariantAdapter, { VariantHttpClient } from '../utils/variant-api-adapter'; import { @@ -53,12 +53,12 @@ export default class VariantEntries extends VariantAdapter; if (isEmpty(this.variantIdList)) { @@ -141,9 +141,9 @@ export default class VariantEntries extends VariantAdapter