diff --git a/packages/scripts/src/commands/app-data/convert/convert.spec.ts b/packages/scripts/src/commands/app-data/convert/convert.spec.ts index ac5dae6f81..f6d6762e33 100644 --- a/packages/scripts/src/commands/app-data/convert/convert.spec.ts +++ b/packages/scripts/src/commands/app-data/convert/convert.spec.ts @@ -64,7 +64,7 @@ describe("App Data Converter", () => { it("Populates output to folder by data type", async () => { await converter.run(); const outputFolders = readdirSync(paths.outputFolder); - expect(outputFolders).toEqual(["data_list", "data_pipe", "template"]); + expect(outputFolders).toEqual(["data_list", "template"]); }); it("Supports input from multiple source folders", async () => { const multipleSourceConverter = new AppDataConverter({ diff --git a/packages/scripts/src/commands/app-data/convert/processors/flowParser/parsers/default.parser.ts b/packages/scripts/src/commands/app-data/convert/processors/flowParser/parsers/default.parser.ts index 4394097e64..b3e3329285 100644 --- a/packages/scripts/src/commands/app-data/convert/processors/flowParser/parsers/default.parser.ts +++ b/packages/scripts/src/commands/app-data/convert/processors/flowParser/parsers/default.parser.ts @@ -268,7 +268,7 @@ class RowProcessor { if (this.parent.flow.flow_type === "data_pipe") return this.row; // Handle replacements const context = { row: this.row }; - return new TemplatedData({ context, initialValue: this.row }).parse(); + return new TemplatedData({ context }).parse(this.row); } private removeMetaFields() { diff --git a/packages/shared/src/models/templatedData/templatedData.spec.ts b/packages/shared/src/models/templatedData/templatedData.spec.ts index 42974e8c9d..4434dea797 100644 --- a/packages/shared/src/models/templatedData/templatedData.spec.ts +++ b/packages/shared/src/models/templatedData/templatedData.spec.ts @@ -118,8 +118,8 @@ describe("Templated Data Parsing", () => { function execTest(testData: ITestData) { const { input, output } = testData; it(JSON.stringify(input), () => { - const parser = new TemplatedData({ context: context.input, initialValue: input }); - const parsedValue = parser.parse(); + const parser = new TemplatedData({ context: context.input }); + const parsedValue = parser.parse(input); expect(parsedValue).toEqual(output); // process.nextTick(() => console.log(` ${JSON.stringify(parsedValue)}\n`)); }); diff --git a/packages/shared/src/models/templatedData/templatedData.ts b/packages/shared/src/models/templatedData/templatedData.ts index 30cae16d77..61af22afc2 100644 --- a/packages/shared/src/models/templatedData/templatedData.ts +++ b/packages/shared/src/models/templatedData/templatedData.ts @@ -1,5 +1,6 @@ import { ITemplatedStringVariable } from "../../types"; import { addStringDelimiters, extractDelimitedTemplateString } from "../../utils/delimiters"; +import { isObjectLiteral } from "../../utils"; type ITemplatedDataContext = { [prefix: string]: any }; @@ -27,9 +28,6 @@ export interface ITemplatedDataContextList { * E.g. {row:{id:'example_1'}} will replace `@row.id` with 'example_1` */ export class TemplatedData { - /** Value containing templated data, e.g. `"Hello @row.id"` */ - private initialValue: any; - /** Value returned after parsing templated data, e.g. `"Hello example_1"` */ public parsedValue: any; @@ -46,14 +44,12 @@ export class TemplatedData { /** A list of all variable replacements carried out during parse (for tracking dependencies list) */ public replacedVariablesList: { [key: string]: string } = {}; - constructor(options?: { initialValue?: any; context?: ITemplatedDataContext }) { - this.updateValue(options?.initialValue ?? ""); + constructor(options?: { context?: ITemplatedDataContext }) { this.updateContext(options?.context ?? {}); } /** Change the initial value whilst keeping existing context same */ public updateValue(value: any) { - this.initialValue = value; this.replacedVariablesList = {}; return this; } @@ -77,18 +73,18 @@ export class TemplatedData { * Main data conversion method * Iterate over data, parse string values and nested objects and arrays recursively */ - public parse(value: T = this.initialValue) { + public parse(value: T) { if (value) { if (typeof value === "string") { value = this.parseTemplatedString(value); } - // recurssively convert array and json-like objects - if (typeof value === "object") { - if (Array.isArray(value)) { - value = value.map((v) => this.parse(v)) as any; - } - if (value.constructor === {}.constructor) { - Object.keys(value).forEach((key) => (value[key] = this.parse(value[key]))); + // recursively convert array and json-like objects + if (Array.isArray(value)) { + value = value.map((v) => this.parse(v)) as any; + } + if (isObjectLiteral(value)) { + for (const [key, nestedValue] of Object.entries(value)) { + value[key] = this.parse(nestedValue); } } }