From b9093fe8786036bc88b476921931f8b96d959b96 Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Thu, 28 Jul 2022 10:29:16 -0300 Subject: [PATCH 1/7] return parsedValue whenever possible --- .../add-update-multiple-records.mjs | 1 + .../actions/add-update-record/add-update-record.mjs | 2 +- .../actions/delete-single-record/delete-single-record.mjs | 1 + .../actions/get-record-or-create/get-record-or-create.mjs | 3 ++- .../actions/has-key-or-create/has-key-or-create.mjs | 2 +- 5 files changed, 6 insertions(+), 3 deletions(-) diff --git a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs index 9962c0f4d0a0b..4a3a72382059a 100644 --- a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs +++ b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs @@ -98,5 +98,6 @@ export default { } else { $.export("$summary", `Successfully added or updated ${keys.length} record(s)`); } + return map; }, }; diff --git a/components/data_stores/actions/add-update-record/add-update-record.mjs b/components/data_stores/actions/add-update-record/add-update-record.mjs index eb95e55340c71..4381b85fabe05 100644 --- a/components/data_stores/actions/add-update-record/add-update-record.mjs +++ b/components/data_stores/actions/add-update-record/add-update-record.mjs @@ -42,7 +42,7 @@ export default { $.export("$summary", `Successfully ${record ? "updated the record for" : "added a new record with the"} key, \`${key}\`.`); return { key, - value, + value: parsedValue, }; }, }; diff --git a/components/data_stores/actions/delete-single-record/delete-single-record.mjs b/components/data_stores/actions/delete-single-record/delete-single-record.mjs index 0f001894dece2..9416863a456e0 100644 --- a/components/data_stores/actions/delete-single-record/delete-single-record.mjs +++ b/components/data_stores/actions/delete-single-record/delete-single-record.mjs @@ -31,6 +31,7 @@ export default { if (record) { await this.dataStore.delete(this.key); $.export("$summary", "Successfully deleted the record for key, `" + this.key + "`."); + return record; } else { $.export("$summary", "No record found for key, `" + this.key + "`. No data was deleted."); } diff --git a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs index 941ebda62053d..54c03e80aee26 100644 --- a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs +++ b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs @@ -42,12 +42,13 @@ export default { if (record) { $.export("$summary", "Found data for the key, `" + this.key + "`."); + return record; } else { if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { const parsedValue = this.app.parseValue(this.value); await this.dataStore.set(this.key, parsedValue); $.export("$summary", "Successfully added a new record with the key, `" + this.key + "`."); - return this.dataStore.get(this.key); + return parsedValue; } else { $.export("$summary", "No data found for key, `" + this.key + "`."); } diff --git a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs index 12c4e40a790a4..f3579910b8595 100644 --- a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs +++ b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs @@ -47,7 +47,7 @@ export default { const parsedValue = this.app.parseValue(this.value); await this.dataStore.set(this.key, parsedValue); $.export("$summary", `Key "${this.key}" was not found. Successfully added a new record.`); - return this.dataStore.get(this.key); + return parsedValue; } $.export("$summary", `Key "${this.key}" does not exist.`); From 60e599b6786f01a84f2f109be5df077c3626be7c Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Thu, 28 Jul 2022 10:32:41 -0300 Subject: [PATCH 2/7] create value prop definition --- .../add-update-record/add-update-record.mjs | 7 ++++--- .../get-record-or-create/get-record-or-create.mjs | 2 +- .../has-key-or-create/has-key-or-create.mjs | 2 +- components/data_stores/data_stores.app.mjs | 14 +++++--------- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/components/data_stores/actions/add-update-record/add-update-record.mjs b/components/data_stores/actions/add-update-record/add-update-record.mjs index 4381b85fabe05..d0ac8813dcbfb 100644 --- a/components/data_stores/actions/add-update-record/add-update-record.mjs +++ b/components/data_stores/actions/add-update-record/add-update-record.mjs @@ -25,9 +25,10 @@ export default { description: "Enter a key for the record you'd like to create or select an existing key to update.", }, value: { - label: "Value", - type: "any", - description: "Enter a string, object, or array.", + propDefinition: [ + app, + "value", + ], }, }, async run({ $ }) { diff --git a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs index 54c03e80aee26..e1d799c886630 100644 --- a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs +++ b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs @@ -33,7 +33,7 @@ export default { }, async additionalProps() { if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { - return this.app.valueProp(); + return this.app.propDefinitions.value; } return {}; }, diff --git a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs index f3579910b8595..20c226e77ffe0 100644 --- a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs +++ b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs @@ -33,7 +33,7 @@ export default { }, async additionalProps() { if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { - return this.app.valueProp(); + return this.app.propDefinitions.value; } return {}; }, diff --git a/components/data_stores/data_stores.app.mjs b/components/data_stores/data_stores.app.mjs index 7a6d54b83abf3..5e59b7afb20ea 100644 --- a/components/data_stores/data_stores.app.mjs +++ b/components/data_stores/data_stores.app.mjs @@ -15,6 +15,11 @@ export default { return dataStore.keys(); }, }, + value: { + label: "Value", + type: "any", + description: "Enter a string, object, or array.", + }, addRecordIfNotFound: { label: "Create a new record if the key is not found?", description: "Create a new record if no records are found for the specified key.", @@ -31,15 +36,6 @@ export default { shouldAddRecord(option) { return option === "Yes"; }, - valueProp() { - return { - value: { - label: "Value", - type: "any", - description: "Enter a string, object, or array.", - }, - }; - }, parseValue(value) { if (typeof value !== "string") { return value; From 7dad3b14b4c135d00966b5f67b51b213e20ef0e3 Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Thu, 28 Jul 2022 10:34:24 -0300 Subject: [PATCH 3/7] minor refactors --- .../add-update-multiple-records.mjs | 3 +-- .../actions/add-update-record/add-update-record.mjs | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs index 4a3a72382059a..a61bf6978505a 100644 --- a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs +++ b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs @@ -68,8 +68,7 @@ export default { */ populateHashMapOfData(data, map) { if (!Array.isArray(data) && typeof(data) === "object") { - Object.keys(data) - .forEach((key) => map[key] = this.convertString(data[key])); + Object.keys(data).forEach((key) => map[key] = this.convertString(data[key])); return; } diff --git a/components/data_stores/actions/add-update-record/add-update-record.mjs b/components/data_stores/actions/add-update-record/add-update-record.mjs index d0ac8813dcbfb..39274b4ec588f 100644 --- a/components/data_stores/actions/add-update-record/add-update-record.mjs +++ b/components/data_stores/actions/add-update-record/add-update-record.mjs @@ -36,11 +36,11 @@ export default { key, value, } = this; - const record = await this.dataStore.get(key); + const exists = await this.dataStore.has(key); const parsedValue = this.app.parseValue(value); await this.dataStore.set(key, parsedValue); // eslint-disable-next-line multiline-ternary - $.export("$summary", `Successfully ${record ? "updated the record for" : "added a new record with the"} key, \`${key}\`.`); + $.export("$summary", `Successfully ${exists ? "updated the record for" : "added a new record with the"} key, \`${key}\`.`); return { key, value: parsedValue, From 305072d580d1536d5e0a48478f90608b12601be4 Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Thu, 28 Jul 2022 10:34:56 -0300 Subject: [PATCH 4/7] refactor summaries exports --- .../add-update-multiple-records.mjs | 3 ++- .../delete-single-record.mjs | 6 +++--- .../get-record-or-create.mjs | 21 +++++++++---------- .../has-key-or-create/has-key-or-create.mjs | 16 +++++++------- 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs index a61bf6978505a..b030b91039f2a 100644 --- a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs +++ b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs @@ -95,7 +95,8 @@ export default { if (keys.length === 0) { $.export("$summary", "No data was added to the data store."); } else { - $.export("$summary", `Successfully added or updated ${keys.length} record(s)`); + // eslint-disable-next-line multiline-ternary + $.export("$summary", `Successfully added or updated ${keys.length} record${keys.length === 1 ? "" : "s"}`); } return map; }, diff --git a/components/data_stores/actions/delete-single-record/delete-single-record.mjs b/components/data_stores/actions/delete-single-record/delete-single-record.mjs index 9416863a456e0..2d5561f8336a6 100644 --- a/components/data_stores/actions/delete-single-record/delete-single-record.mjs +++ b/components/data_stores/actions/delete-single-record/delete-single-record.mjs @@ -30,10 +30,10 @@ export default { if (record) { await this.dataStore.delete(this.key); - $.export("$summary", "Successfully deleted the record for key, `" + this.key + "`."); + $.export("$summary", `Successfully deleted the record for key, \`${this.key}\`.`); return record; - } else { - $.export("$summary", "No record found for key, `" + this.key + "`. No data was deleted."); } + + $.export("$summary", `No record found for key, \`${this.key}\`. No data was deleted.`); }, }; diff --git a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs index e1d799c886630..0a2f5a574066a 100644 --- a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs +++ b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs @@ -41,19 +41,18 @@ export default { const record = await this.dataStore.get(this.key); if (record) { - $.export("$summary", "Found data for the key, `" + this.key + "`."); + $.export("$summary", `Found data for the key, \`${this.key}\`.`); return record; - } else { - if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { - const parsedValue = this.app.parseValue(this.value); - await this.dataStore.set(this.key, parsedValue); - $.export("$summary", "Successfully added a new record with the key, `" + this.key + "`."); - return parsedValue; - } else { - $.export("$summary", "No data found for key, `" + this.key + "`."); - } } - return record; + if (!this.app.shouldAddRecord(this.addRecordIfNotFound)) { + $.export("$summary", `No data found for key, \`${this.key}\`.`); + return; + } + + const parsedValue = this.app.parseValue(this.value); + await this.dataStore.set(this.key, parsedValue); + $.export("$summary", `Successfully added a new record with the key, \`${this.key}\`.`); + return parsedValue; }, }; diff --git a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs index 20c226e77ffe0..dd1beb9030df7 100644 --- a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs +++ b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs @@ -39,18 +39,18 @@ export default { }, async run ({ $ }) { if (await this.dataStore.has(this.key)) { - $.export("$summary", `Key "${this.key}" exists.`); + $.export("$summary", `Key \`${this.key}\` exists.`); return true; } - if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { - const parsedValue = this.app.parseValue(this.value); - await this.dataStore.set(this.key, parsedValue); - $.export("$summary", `Key "${this.key}" was not found. Successfully added a new record.`); - return parsedValue; + if (!this.app.shouldAddRecord(this.addRecordIfNotFound)) { + $.export("$summary", `Key \`${this.key}\` does not exist.`); + return false; } - $.export("$summary", `Key "${this.key}" does not exist.`); - return false; + const parsedValue = this.app.parseValue(this.value); + await this.dataStore.set(this.key, parsedValue); + $.export("$summary", `Key \`${this.key}\` was not found. Successfully added a new record.`); + return parsedValue; }, }; From 1452494c77239a66e92f09ccb40a9363aae1ee0a Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Thu, 28 Jul 2022 10:24:35 -0300 Subject: [PATCH 5/7] use Function to evaluate js objects --- .../add-update-multiple-records.mjs | 11 ++----- components/data_stores/data_stores.app.mjs | 29 +++++++++++++------ 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs index b030b91039f2a..6c0e21de67cb5 100644 --- a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs +++ b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs @@ -1,5 +1,4 @@ import app from "../../data_stores.app.mjs"; -import xss from "xss"; export default { key: "data_stores-add-update-multiple-records", @@ -53,13 +52,7 @@ export default { } } - // Try to evaluate string as javascript, using xss as extra security - // If some problem occurs, return the original string - try { - return eval(`(${xss(value)})`); - } catch { - return value; - } + return this.app.evaluate(value); }, /** * Add all the key-value pairs in the map object to be used in the data store @@ -86,7 +79,7 @@ export default { }, async run({ $ }) { if (typeof this.data === "string") { - this.data = eval(`(${this.data})`); + this.data = this.app.evaluate(this.data); } const map = this.getHashMapOfData(this.data); const keys = Object.keys(map); diff --git a/components/data_stores/data_stores.app.mjs b/components/data_stores/data_stores.app.mjs index 5e59b7afb20ea..2bf4ed49291d4 100644 --- a/components/data_stores/data_stores.app.mjs +++ b/components/data_stores/data_stores.app.mjs @@ -1,3 +1,10 @@ +import xss from "xss"; + +/** + * Should support the following data types: + * https://pipedream.com/docs/data-stores/#supported-data-types + */ + export default { type: "app", app: "data_stores", @@ -33,6 +40,18 @@ export default { }, }, methods: { + // using Function approach instead of eval: + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval#never_use_eval! + evaluate(value) { + try { + return Function(`"use strict"; return (${xss(value)})`)(); + } catch (err) { + return value; + } + }, + parseJSON(value) { + return JSON.parse(JSON.stringify(this.evaluate(value))); + }, shouldAddRecord(option) { return option === "Yes"; }, @@ -42,18 +61,10 @@ export default { } try { - return JSON.parse(this.sanitizeJson(value)); + return this.parseJSON(value); } catch (err) { return value; } }, - //Because user might enter a JSON as JS object; - //This method converts a JS object string to a JSON string before parsing it - //e.g. {a:"b", 'c':1} => {"a":"b", "c":1} - //We don't use eval here because of security reasons. - //Using eval may cause something undesired run in the script. - sanitizeJson(str) { - return str.replace(/(['"])?([a-z0-9A-Z_]+)(['"])?:/g, "\"$2\": "); - }, }, }; From 8943c7b0dee65751460ecbc9edcdc660b98338e2 Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Thu, 28 Jul 2022 10:33:50 -0300 Subject: [PATCH 6/7] bump patch versions --- .../add-update-multiple-records/add-update-multiple-records.mjs | 2 +- .../data_stores/actions/add-update-record/add-update-record.mjs | 2 +- .../actions/delete-single-record/delete-single-record.mjs | 2 +- .../actions/get-record-or-create/get-record-or-create.mjs | 2 +- .../data_stores/actions/has-key-or-create/has-key-or-create.mjs | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs index 6c0e21de67cb5..33095b7aebff7 100644 --- a/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs +++ b/components/data_stores/actions/add-update-multiple-records/add-update-multiple-records.mjs @@ -4,7 +4,7 @@ export default { key: "data_stores-add-update-multiple-records", name: "Add or update multiple records", description: "Add or update multiple records to your [Pipedream Data Store](https://pipedream.com/data-stores/).", - version: "0.0.4", + version: "0.0.5", type: "action", props: { app, diff --git a/components/data_stores/actions/add-update-record/add-update-record.mjs b/components/data_stores/actions/add-update-record/add-update-record.mjs index 39274b4ec588f..bcd54ac4cf255 100644 --- a/components/data_stores/actions/add-update-record/add-update-record.mjs +++ b/components/data_stores/actions/add-update-record/add-update-record.mjs @@ -4,7 +4,7 @@ export default { key: "data_stores-add-update-record", name: "Add or update a single record", description: "Add or update a single record in your [Pipedream Data Store](https://pipedream.com/data-stores/).", - version: "0.0.7", + version: "0.0.8", type: "action", props: { app, diff --git a/components/data_stores/actions/delete-single-record/delete-single-record.mjs b/components/data_stores/actions/delete-single-record/delete-single-record.mjs index 2d5561f8336a6..daabe2a7a3fe2 100644 --- a/components/data_stores/actions/delete-single-record/delete-single-record.mjs +++ b/components/data_stores/actions/delete-single-record/delete-single-record.mjs @@ -4,7 +4,7 @@ export default { key: "data_stores-delete-single-record", name: "Delete a single record", description: "Delete a single record in your [Pipedream Data Store](https://pipedream.com/data-stores/).", - version: "0.0.6", + version: "0.0.7", type: "action", props: { app, diff --git a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs index 0a2f5a574066a..0f28282d7127a 100644 --- a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs +++ b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs @@ -4,7 +4,7 @@ export default { key: "data_stores-get-record-or-create", name: "Get record (or create one if not found)", description: "Get a single record in your [Pipedream Data Store](https://pipedream.com/data-stores/) or create one if it doesn't exist.", - version: "0.0.7", + version: "0.0.8", type: "action", props: { app, diff --git a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs index dd1beb9030df7..837b0d4f7ebc3 100644 --- a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs +++ b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs @@ -4,7 +4,7 @@ export default { key: "data_stores-has-key-or-create", name: "Check for existence of key", description: "Check if a key exists in your [Pipedream Data Store](https://pipedream.com/data-stores/) or create one if it doesn't exist.", - version: "0.0.3", + version: "0.0.4", type: "action", props: { app, From b9d2d1fed3d45bd64a1e19103945d03cdcf046d8 Mon Sep 17 00:00:00 2001 From: Andrew Chuang Date: Tue, 2 Aug 2022 08:05:32 -0300 Subject: [PATCH 7/7] fix additional props --- .../actions/get-record-or-create/get-record-or-create.mjs | 5 +++-- .../actions/has-key-or-create/has-key-or-create.mjs | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs index 0f28282d7127a..643efddcdbaca 100644 --- a/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs +++ b/components/data_stores/actions/get-record-or-create/get-record-or-create.mjs @@ -32,10 +32,11 @@ export default { }, }, async additionalProps() { + const props = {}; if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { - return this.app.propDefinitions.value; + props.value = app.propDefinitions.value; } - return {}; + return props; }, async run({ $ }) { const record = await this.dataStore.get(this.key); diff --git a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs index 837b0d4f7ebc3..72237b9cbb8d0 100644 --- a/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs +++ b/components/data_stores/actions/has-key-or-create/has-key-or-create.mjs @@ -32,10 +32,11 @@ export default { }, }, async additionalProps() { + const props = {}; if (this.app.shouldAddRecord(this.addRecordIfNotFound)) { - return this.app.propDefinitions.value; + props.value = app.propDefinitions.value; } - return {}; + return props; }, async run ({ $ }) { if (await this.dataStore.has(this.key)) {