From 3d227f7126c96df9bf64fbd9587ac5d8f19fe17c Mon Sep 17 00:00:00 2001 From: Dilip Kola Date: Tue, 10 Dec 2024 14:39:19 +0530 Subject: [PATCH 01/11] fix: pr body in constants pr workflow --- .github/workflows/raise-pr-for-constants.yml | 27 ++++++++++---------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/.github/workflows/raise-pr-for-constants.yml b/.github/workflows/raise-pr-for-constants.yml index 47691c630..ef5fd004c 100644 --- a/.github/workflows/raise-pr-for-constants.yml +++ b/.github/workflows/raise-pr-for-constants.yml @@ -33,10 +33,10 @@ jobs: id: compare_files run: | if cmp -s "${{ env.SRC_FILE }}" "dest-repo/${{ env.DEST_PATH }}"; then - echo "No changes detected." > "result.txt" + echo "No changes detected." echo "pr_required=false" >> $GITHUB_OUTPUT else - echo "Changes detected." > "result.txt" + echo "Changes detected." echo "pr_required=true" >> $GITHUB_OUTPUT fi @@ -58,20 +58,21 @@ jobs: GH_TOKEN: ${{ secrets.PAT }} run: | cd dest-repo - EXISTING_PR=$(gh pr list --head ${{ env.BRANCH_NAME }} --json number --jq ".[0].number") + EXISTING_PR=$(gh pr list --head "$BRANCH_NAME" --json number --jq ".[0].number") if [ -z "$EXISTING_PR" ]; then - gh pr create \ - --title "fix: update destination constants" \ - --body "$(cat < Date: Tue, 10 Dec 2024 14:45:40 +0530 Subject: [PATCH 02/11] fix: pr body in constants pr workflow --- .github/workflows/raise-pr-for-constants.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/raise-pr-for-constants.yml b/.github/workflows/raise-pr-for-constants.yml index ef5fd004c..87ad99b84 100644 --- a/.github/workflows/raise-pr-for-constants.yml +++ b/.github/workflows/raise-pr-for-constants.yml @@ -66,7 +66,7 @@ jobs: **Changes:** - Updated \`Destinations.ts\` with latest constants - NOTE: This PR was automatically generated by GitHub Actions." + **NOTE:** This PR was automatically generated by GitHub Actions." # Create a new PR gh pr create \ From e8c5167cad5f9792e2621ddc7695fe85b7aa8fb4 Mon Sep 17 00:00:00 2001 From: Dilip Kola Date: Tue, 10 Dec 2024 15:05:46 +0530 Subject: [PATCH 03/11] fix: pr labels in constants pr workflow --- .github/workflows/raise-pr-for-constants.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/raise-pr-for-constants.yml b/.github/workflows/raise-pr-for-constants.yml index 87ad99b84..b559d8d8c 100644 --- a/.github/workflows/raise-pr-for-constants.yml +++ b/.github/workflows/raise-pr-for-constants.yml @@ -72,7 +72,7 @@ jobs: gh pr create \ --title "fix: update destination constants" \ --body "$PR_BODY" \ - --label "automated,dependencies" + --label "github_actions,dependencies" else echo "PR already exists: $EXISTING_PR" fi From 52f9bf2015e07c9466f59edbc0311cb22841d3ea Mon Sep 17 00:00:00 2001 From: Dilip Kola <33080863+koladilip@users.noreply.github.com> Date: Thu, 12 Dec 2024 17:35:42 +0530 Subject: [PATCH 04/11] chore: add item name to script to update single destination (#1837) --- scripts/deployToDB.py | 116 +++++++++++++------------- scripts/listJsonMapperDestinations.js | 48 +++++++++++ 2 files changed, 107 insertions(+), 57 deletions(-) create mode 100644 scripts/listJsonMapperDestinations.js diff --git a/scripts/deployToDB.py b/scripts/deployToDB.py index c04cf3f40..b2f1f37bb 100644 --- a/scripts/deployToDB.py +++ b/scripts/deployToDB.py @@ -8,41 +8,67 @@ from constants import CONFIG_DIR +ALL_SELECTORS = ["destination", "source", "wht-lib-project"] + + def get_command_line_arguments(): parser = argparse.ArgumentParser(description="Script to deploy config files to DB.") parser.add_argument("control_plane_url", nargs="?", help="Control plane URL") parser.add_argument("username", nargs="?", help="Control plane admin username") parser.add_argument("password", nargs="?", help="Control plane admin password") + parser.add_argument( + "selector", + nargs="?", + help="Specify destination, source or wht-lib-project", + default=None, + ) + parser.add_argument( + "item_name", nargs="?", help="Specific item name to update.", default=None + ) args = parser.parse_args() control_plane_url = args.control_plane_url or os.getenv("CONTROL_PLANE_URL") username = args.username or os.getenv("API_USER") password = args.password or os.getenv("API_PASSWORD") + selector = args.selector or os.getenv("SELECTOR") + item_name = args.item_name or os.getenv("ITEM_NAME") - missing_args = [] + invalid_args = [] if control_plane_url is None: - missing_args.append( - "1st positional argument or CONTROL_PLANE_URL environment variable" + invalid_args.append( + "1st positional argument or CONTROL_PLANE_URL environment variable is missing" ) if username is None: - missing_args.append("2nd positional argument or API_USER environment variable") + invalid_args.append( + "2nd positional argument or API_USER environment variable is missing" + ) if password is None: - missing_args.append( - "3rd positional argument or API_PASSWORD environment variable" + invalid_args.append( + "3rd positional argument or API_PASSWORD environment variable is missing" ) + if selector is None: + SELECTORS = ALL_SELECTORS + elif selector not in ALL_SELECTORS: + invalid_args.append( + "4th positional argument or SELECTOR environment variable is invalid" + ) + else: + SELECTORS = [selector] - if missing_args: - print("Error: Missing the following arguments or environment variables:") - for arg in missing_args: + if invalid_args: + print("Error: The following arguments or environment variables are invalid:") + for arg in invalid_args: print(arg) sys.exit(1) - return control_plane_url, username, password + return control_plane_url, username, password, SELECTORS, item_name -CONTROL_PLANE_URL, USERNAME, PASSWORD = get_command_line_arguments() +CONTROL_PLANE_URL, USERNAME, PASSWORD, SELECTORS, ITEM_NAME = ( + get_command_line_arguments() +) # CONSTANTS HEADER = {"Content-Type": "application/json"} @@ -139,11 +165,16 @@ def update_config(data_diff, selector): return json.dumps(results, indent=2) -def update_diff_db(selector): +def update_diff_db(selector, item_name=None): final_report = [] ## data sets - current_items = os.listdir(f"./{CONFIG_DIR}/{selector}s") + if item_name: + current_items = [item_name] + else: + current_items = os.listdir(f"./{CONFIG_DIR}/{selector}s") + + print(f"Current items: {current_items}") for item in current_items: # check if item is a directory @@ -203,47 +234,18 @@ def get_stale_data(selector, report): if __name__ == "__main__": - print("\n") - print("#" * 50) - print("Running Destination Definitions Updates") - dest_final_report = update_diff_db("destination") - - print("\n") - print("#" * 50) - print("Destination Definition Update Report") - print(get_formatted_json(dest_final_report)) - - print("\n") - print("#" * 50) - print("Stale Destinations Report") - print(get_formatted_json(get_stale_data("destination", dest_final_report))) - - print("\n") - print("#" * 50) - print("Running Source Definitions Updates") - src_final_report = update_diff_db("source") - - print("\n") - print("#" * 50) - print("Source Definition Update Report") - print(get_formatted_json(src_final_report)) - - print("\n") - print("#" * 50) - print("Stale Sources Report") - print(get_formatted_json(get_stale_data("source", src_final_report))) - - print("\n") - print("#" * 50) - print("Running Wht Lib Project Definitions Updates") - wht_final_report = update_diff_db("wht-lib-project") - - print("\n") - print("#" * 50) - print("Wht Lib Project Definition Update Report") - print(get_formatted_json(wht_final_report)) - - print("\n") - print("#" * 50) - print("Stale Wht Lib Projects Report") - print(get_formatted_json(get_stale_data("wht-lib-project", wht_final_report))) + for selector in SELECTORS: + print("\n") + print("#" * 50) + print("Running {} Definitions Updates".format(selector.capitalize())) + final_report = update_diff_db(selector, ITEM_NAME) + + print("\n") + print("#" * 50) + print("{} Definition Update Report".format(selector.capitalize())) + print(get_formatted_json(final_report)) + + print("\n") + print("#" * 50) + print("Stale {}s Report".format(selector.capitalize())) + print(get_formatted_json(get_stale_data(selector, final_report))) diff --git a/scripts/listJsonMapperDestinations.js b/scripts/listJsonMapperDestinations.js new file mode 100644 index 000000000..3520fc088 --- /dev/null +++ b/scripts/listJsonMapperDestinations.js @@ -0,0 +1,48 @@ +/* eslint-disable no-console */ +const fs = require('fs'); +const path = require('path'); + +const destinationsDir = path.join(__dirname, '../src/configurations/destinations'); + +function findJsonMapperDestinations() { + try { + if (!fs.existsSync(destinationsDir)) { + throw new Error(`Destinations directory not found: ${destinationsDir}`); + } + return fs + .readdirSync(destinationsDir) + .map((destination) => { + try { + const destinationsFilePath = path.join(destinationsDir, destination, 'db-config.json'); + if (!fs.existsSync(destinationsFilePath)) { + console.warn(`Skipping ${destination}: Missing configuration file`); + return null; + } + const destinationsContent = fs.readFileSync(destinationsFilePath, 'utf8'); + const destinationDefinition = JSON.parse(destinationsContent); + if (!destinationDefinition.name) { + console.warn(`Skipping ${destination}: Missing name`); + return null; + } + return { + name: destinationDefinition.name, + config: destinationDefinition.config, + }; + } catch (err) { + console.error(`Error processing ${destination}:`, err.message); + return null; + } + }) + .filter(Boolean) + .filter( + (destination) => + !destination.config?.disableJsonMapper && !destination.config?.supportsVisualMapper, + ) + .map((destination) => destination.name); + } catch (err) { + console.error('Failed to process destinations:', err.message); + return []; + } +} + +console.log(findJsonMapperDestinations().join('\n')); From 1f4e1c5edb6fb95be21e62d5671427a91a371a50 Mon Sep 17 00:00:00 2001 From: Sai Kumar Battinoju <88789928+saikumarrs@users.noreply.github.com> Date: Thu, 12 Dec 2024 17:50:40 +0530 Subject: [PATCH 05/11] feat: add tags for sdk source types (#1841) --- src/configurations/sources/amp/db-config.json | 5 ++++- src/configurations/sources/android/db-config.json | 5 ++++- src/configurations/sources/cordova/db-config.json | 5 ++++- src/configurations/sources/dotnet/db-config.json | 5 ++++- src/configurations/sources/flutter/db-config.json | 5 ++++- src/configurations/sources/go/db-config.json | 5 ++++- src/configurations/sources/ios/db-config.json | 5 ++++- src/configurations/sources/java/db-config.json | 5 ++++- src/configurations/sources/javascript/db-config.json | 5 ++++- src/configurations/sources/node/db-config.json | 5 ++++- src/configurations/sources/php/db-config.json | 5 ++++- src/configurations/sources/python/db-config.json | 5 ++++- src/configurations/sources/react_native/db-config.json | 5 ++++- src/configurations/sources/ruby/db-config.json | 5 ++++- src/configurations/sources/rust/db-config.json | 5 ++++- src/configurations/sources/unity/db-config.json | 5 ++++- src/schemas/sources/db-config-schema.json | 6 ++++++ 17 files changed, 70 insertions(+), 16 deletions(-) diff --git a/src/configurations/sources/amp/db-config.json b/src/configurations/sources/amp/db-config.json index f27a7d0cf..d98b0b85c 100644 --- a/src/configurations/sources/amp/db-config.json +++ b/src/configurations/sources/amp/db-config.json @@ -1,5 +1,8 @@ { "name": "AMP", "displayName": "AMP", - "type": "amp" + "type": "amp", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/android/db-config.json b/src/configurations/sources/android/db-config.json index 95473faed..d9e1b8c21 100644 --- a/src/configurations/sources/android/db-config.json +++ b/src/configurations/sources/android/db-config.json @@ -1,5 +1,8 @@ { "name": "Android", "displayName": "Android", - "type": "android" + "type": "android", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/cordova/db-config.json b/src/configurations/sources/cordova/db-config.json index 5ee84ca76..6cc47e2d2 100644 --- a/src/configurations/sources/cordova/db-config.json +++ b/src/configurations/sources/cordova/db-config.json @@ -1,5 +1,8 @@ { "name": "Cordova", "displayName": "Cordova", - "type": "cordova" + "type": "cordova", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/dotnet/db-config.json b/src/configurations/sources/dotnet/db-config.json index dd5204182..f737ad33c 100644 --- a/src/configurations/sources/dotnet/db-config.json +++ b/src/configurations/sources/dotnet/db-config.json @@ -1,5 +1,8 @@ { "name": "DotNet", "displayName": ".Net", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/flutter/db-config.json b/src/configurations/sources/flutter/db-config.json index d2b602e62..26856f086 100644 --- a/src/configurations/sources/flutter/db-config.json +++ b/src/configurations/sources/flutter/db-config.json @@ -1,5 +1,8 @@ { "name": "Flutter", "displayName": "Flutter", - "type": "flutter" + "type": "flutter", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/go/db-config.json b/src/configurations/sources/go/db-config.json index ca4b23f3c..76e630e2d 100644 --- a/src/configurations/sources/go/db-config.json +++ b/src/configurations/sources/go/db-config.json @@ -1,5 +1,8 @@ { "name": "Go", "displayName": "Go", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/ios/db-config.json b/src/configurations/sources/ios/db-config.json index a55f4d793..4d65dc374 100644 --- a/src/configurations/sources/ios/db-config.json +++ b/src/configurations/sources/ios/db-config.json @@ -1,5 +1,8 @@ { "name": "iOS", "displayName": "iOS", - "type": "ios" + "type": "ios", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/java/db-config.json b/src/configurations/sources/java/db-config.json index 58f6b8686..506d5dc28 100644 --- a/src/configurations/sources/java/db-config.json +++ b/src/configurations/sources/java/db-config.json @@ -1,5 +1,8 @@ { "name": "Java", "displayName": "Java", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/javascript/db-config.json b/src/configurations/sources/javascript/db-config.json index e823e2183..4f0773d72 100644 --- a/src/configurations/sources/javascript/db-config.json +++ b/src/configurations/sources/javascript/db-config.json @@ -1,5 +1,8 @@ { "name": "Javascript", "displayName": "Javascript", - "type": "web" + "type": "web", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/node/db-config.json b/src/configurations/sources/node/db-config.json index c7ab6a7ff..8d897bee4 100644 --- a/src/configurations/sources/node/db-config.json +++ b/src/configurations/sources/node/db-config.json @@ -1,5 +1,8 @@ { "name": "Node", "displayName": "Node", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/php/db-config.json b/src/configurations/sources/php/db-config.json index c34a3cdd5..149c70949 100644 --- a/src/configurations/sources/php/db-config.json +++ b/src/configurations/sources/php/db-config.json @@ -1,5 +1,8 @@ { "name": "PHP", "displayName": "PHP", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/python/db-config.json b/src/configurations/sources/python/db-config.json index 76415d16d..e8ee2c15c 100644 --- a/src/configurations/sources/python/db-config.json +++ b/src/configurations/sources/python/db-config.json @@ -1,5 +1,8 @@ { "name": "Python", "displayName": "Python", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/react_native/db-config.json b/src/configurations/sources/react_native/db-config.json index 37a80466e..f49efcbfa 100644 --- a/src/configurations/sources/react_native/db-config.json +++ b/src/configurations/sources/react_native/db-config.json @@ -1,5 +1,8 @@ { "name": "ReactNative", "displayName": "React Native", - "type": "reactnative" + "type": "reactnative", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/configurations/sources/ruby/db-config.json b/src/configurations/sources/ruby/db-config.json index 8b0e872f2..6da7a202d 100644 --- a/src/configurations/sources/ruby/db-config.json +++ b/src/configurations/sources/ruby/db-config.json @@ -1,5 +1,8 @@ { "name": "Ruby", "displayName": "Ruby", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/rust/db-config.json b/src/configurations/sources/rust/db-config.json index 12e377523..aa4322a1f 100644 --- a/src/configurations/sources/rust/db-config.json +++ b/src/configurations/sources/rust/db-config.json @@ -1,5 +1,8 @@ { "name": "Rust", "displayName": "Rust", - "type": "cloud" + "type": "cloud", + "options": { + "sdkExecutionEnvironment": "server" + } } diff --git a/src/configurations/sources/unity/db-config.json b/src/configurations/sources/unity/db-config.json index ab4bf8d8e..1783a5160 100644 --- a/src/configurations/sources/unity/db-config.json +++ b/src/configurations/sources/unity/db-config.json @@ -1,5 +1,8 @@ { "name": "Unity", "displayName": "Unity", - "type": "unity" + "type": "unity", + "options": { + "sdkExecutionEnvironment": "client" + } } diff --git a/src/schemas/sources/db-config-schema.json b/src/schemas/sources/db-config-schema.json index dc1cfa381..1761b63d6 100644 --- a/src/schemas/sources/db-config-schema.json +++ b/src/schemas/sources/db-config-schema.json @@ -146,6 +146,12 @@ "type": "boolean", "title": "Supports Destination Sync Mode", "description": "TBD" + }, + "sdkExecutionEnvironment": { + "type": "string", + "title": "SDK Execution Environment", + "description": "It denotes the environment in which the SDK is executed. The presence of this field also indicates that the source is an SDK source.", + "enum": ["server", "client"] } } } From 2c683fec0ac8d8518096413c6d2b018a1e7b4d1e Mon Sep 17 00:00:00 2001 From: Aanshi Lahoti <110057617+aanshi07@users.noreply.github.com> Date: Fri, 13 Dec 2024 14:42:55 +0530 Subject: [PATCH 06/11] feat: onboard topsort destination (#1842) --- .../destinations/topsort/db-config.json | 109 +++ .../destinations/topsort/schema.json | 876 ++++++++++++++++++ .../destinations/topsort/ui-config.json | 260 ++++++ .../data/validation/destinations/topsort.json | 197 ++++ 4 files changed, 1442 insertions(+) create mode 100644 src/configurations/destinations/topsort/db-config.json create mode 100644 src/configurations/destinations/topsort/schema.json create mode 100644 src/configurations/destinations/topsort/ui-config.json create mode 100644 test/data/validation/destinations/topsort.json diff --git a/src/configurations/destinations/topsort/db-config.json b/src/configurations/destinations/topsort/db-config.json new file mode 100644 index 000000000..a332d44c6 --- /dev/null +++ b/src/configurations/destinations/topsort/db-config.json @@ -0,0 +1,109 @@ +{ + "name": "TOPSORT", + "displayName": "Topsort", + "config": { + "transformAtV1": "processor", + "saveDestinationResponse": true, + "excludeKeys": [], + "supportedSourceTypes": [ + "android", + "ios", + "unity", + "amp", + "web", + "cloud", + "warehouse", + "reactnative", + "flutter", + "cordova", + "shopify" + ], + "supportedMessageTypes": { "cloud": ["track"] }, + "supportedConnectionModes": { + "android": ["cloud"], + "ios": ["cloud"], + "web": ["cloud"], + "unity": ["cloud"], + "amp": ["cloud"], + "reactnative": ["cloud"], + "flutter": ["cloud"], + "cordova": ["cloud"], + "shopify": ["cloud"], + "cloud": ["cloud"], + "warehouse": ["cloud"] + }, + "destConfig": { + "defaultConfig": ["apiKey", "topsortEvents"], + "android": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "ios": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "unity": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "amp": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "reactnative": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "flutter": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "cordova": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "web": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "cloud": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "shopify": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ], + "warehouse": [ + "connectionMode", + "consentManagement", + "oneTrustCookieCategories", + "ketchConsentPurposes" + ] + }, + "secretKeys": ["apiKey"] + }, + "options": { + "isBeta": true + } +} diff --git a/src/configurations/destinations/topsort/schema.json b/src/configurations/destinations/topsort/schema.json new file mode 100644 index 000000000..be1f7159f --- /dev/null +++ b/src/configurations/destinations/topsort/schema.json @@ -0,0 +1,876 @@ +{ + "configSchema": { + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["apiKey"], + "type": "object", + "properties": { + "apiKey": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{1,100})$" + }, + "topsortEvents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "from": { + "type": "string", + "enum": [ + "Product Clicked", + "Product Viewed", + "Product Added", + "Product Removed", + "Cart Viewed", + "Checkout Started", + "Checkout Step Viewed", + "Payment Info Entered", + "Order Updated", + "Order Completed", + "Order Refunded", + "Order Cancelled" + ] + }, + "to": { + "type": "string", + "enum": ["clicks", "impressions", "purchases"] + } + } + } + }, + "oneTrustCookieCategories": { + "type": "object", + "properties": { + "android": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "ios": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "unity": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "amp": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "reactnative": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "flutter": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "cordova": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "web": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "cloud": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "shopify": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "warehouse": { + "type": "array", + "items": { + "type": "object", + "properties": { + "oneTrustCookieCategory": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + } + }, + "consentManagement": { + "type": "object", + "properties": { + "cloud": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "warehouse": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "android": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "ios": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "web": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "unity": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "amp": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "reactnative": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "flutter": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "cordova": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + }, + "shopify": { + "type": "array", + "items": { + "type": "object", + "properties": { + "provider": { + "type": "string", + "enum": ["custom", "ketch", "oneTrust"], + "default": "oneTrust" + }, + "consents": { + "type": "array", + "items": { + "type": "object", + "properties": { + "consent": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + }, + "allOf": [ + { + "if": { + "properties": { + "provider": { + "const": "custom" + } + }, + "required": ["provider"] + }, + "then": { + "properties": { + "resolutionStrategy": { + "type": "string", + "enum": ["and", "or"] + } + }, + "required": ["resolutionStrategy"] + } + } + ] + } + } + } + }, + "ketchConsentPurposes": { + "type": "object", + "properties": { + "android": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "ios": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "unity": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "amp": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "reactnative": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "flutter": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "cordova": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "web": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "cloud": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "shopify": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + }, + "warehouse": { + "type": "array", + "items": { + "type": "object", + "properties": { + "purpose": { + "type": "string", + "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$" + } + } + } + } + } + }, + "connectionMode": { + "type": "object", + "properties": { + "android": { + "type": "string", + "enum": ["cloud"] + }, + "ios": { + "type": "string", + "enum": ["cloud"] + }, + "web": { + "type": "string", + "enum": ["cloud"] + }, + "unity": { + "type": "string", + "enum": ["cloud"] + }, + "amp": { + "type": "string", + "enum": ["cloud"] + }, + "reactnative": { + "type": "string", + "enum": ["cloud"] + }, + "flutter": { + "type": "string", + "enum": ["cloud"] + }, + "cordova": { + "type": "string", + "enum": ["cloud"] + }, + "shopify": { + "type": "string", + "enum": ["cloud"] + }, + "cloud": { + "type": "string", + "enum": ["cloud"] + }, + "warehouse": { + "type": "string", + "enum": ["cloud"] + } + } + } + } + } +} diff --git a/src/configurations/destinations/topsort/ui-config.json b/src/configurations/destinations/topsort/ui-config.json new file mode 100644 index 000000000..6a6d4573c --- /dev/null +++ b/src/configurations/destinations/topsort/ui-config.json @@ -0,0 +1,260 @@ +{ + "uiConfig": { + "baseTemplate": [ + { + "title": "Initial setup", + "note": "Review how this destination is set up", + "sections": [ + { + "groups": [ + { + "title": "Connection Settings", + "note": "Update your connection settings here", + "icon": "settings", + "fields": [ + { + "type": "textInput", + "label": "API Key", + "configKey": "apiKey", + "regex": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{1,100})$", + "regexErrorMessage": "Invalid API Key", + "placeholder": "e.g. 88a1b72e-a017-4803-9854-0c447045c29e" + } + ] + } + ] + }, + { + "groups": [ + { + "title": "Connection mode", + "note": [ + "Update how you want to route events from your source to destination. ", + { + "text": "Get help deciding", + "link": "https://www.rudderstack.com/docs/destinations/rudderstack-connection-modes/" + } + ], + "icon": "sliders", + "fields": [] + } + ] + } + ] + }, + { + "title": "Configuration settings", + "note": "Manage the settings for your destination", + "sections": [ + { + "id": "consentSettings", + "title": "Consent settings", + "note": "Configure consent settings for each provider here", + "icon": "settings", + "groups": [] + } + ] + }, + { + "title": "Event mapping", + "note": "Map RudderStack events to Topsort events", + "hideEditIcon": true, + "sections": [ + { + "groups": [ + { + "title": "RudderStack Event to Topsort Event Mapping", + "fields": [ + { + "type": "redirect", + "redirectGroupKey": "eventsMapping", + "label": "Event and property mappings", + "note": "Map RudderStack events/properties to Topsort events/properties" + } + ] + } + ] + } + ] + } + ], + "sdkTemplate": { + "title": "SDK settings", + "note": "not visible in the ui", + "fields": [] + }, + "redirectGroups": { + "eventsMapping": { + "fields": [ + { + "type": "mapping", + "label": "Map RudderStack event to Topsort event", + "configKey": "topsortEvents", + "default": [ + { + "from": "Product Clicked", + "to": "clicks" + }, + { + "from": "Product Viewed", + "to": "impressions" + }, + { + "from": "Order Completed", + "to": "purchases" + } + ], + "columns": [ + { + "type": "singleSelect", + "key": "from", + "label": "RudderStack Event", + "options": [ + { + "label": "Product Clicked", + "value": "Product Clicked" + }, + { + "label": "Product Viewed", + "value": "Product Viewed" + }, + { + "label": "Product Added", + "value": "Product Added" + }, + { + "label": "Product Removed", + "value": "Product Removed" + }, + { + "label": "Cart Viewed", + "value": "Cart Viewed" + }, + { + "label": "Checkout Started", + "value": "Checkout Started" + }, + { + "label": "Checkout Step Viewed", + "value": "Checkout Step Viewed" + }, + { + "label": "Payment Info Entered", + "value": "Payment Info Entered" + }, + { + "label": "Order Updated", + "value": "Order Updated" + }, + { + "label": "Order Completed", + "value": "Order Completed" + }, + { + "label": "Order Refunded", + "value": "Order Refunded" + }, + { + "label": "Order Cancelled", + "value": "Order Cancelled" + } + ] + }, + { + "type": "singleSelect", + "key": "to", + "label": "Topsort event", + "options": [ + { + "label": "clicks", + "value": "clicks" + }, + { + "label": "impressions", + "value": "impressions" + }, + { + "label": "purchases", + "value": "purchases" + } + ] + } + ] + } + ] + } + }, + "consentSettingsTemplate": { + "title": "Consent settings", + "note": "not visible in the ui", + "fields": [ + { + "type": "dynamicCustomForm", + "configKey": "consentManagement", + "default": [], + "rowFields": [ + { + "type": "singleSelect", + "label": "Consent management provider", + "configKey": "provider", + "options": [ + { + "label": "Custom", + "value": "custom" + }, + { + "label": "Ketch", + "value": "ketch" + }, + { + "label": "OneTrust", + "value": "oneTrust" + } + ], + "default": "oneTrust", + "required": true + }, + { + "type": "singleSelect", + "label": "the required consent logic", + "configKey": "resolutionStrategy", + "options": [ + { + "label": "AND", + "value": "and" + }, + { + "label": "OR", + "value": "or" + } + ], + "required": true, + "variant": "badge", + "preRequisites": { + "fields": [ + { + "configKey": "provider", + "value": "custom" + } + ] + } + }, + { + "type": "tagInput", + "label": "Enter consent category IDs", + "note": "Input your consent category IDs by pressing 'Enter' after each entry. We recommend using IDs instead of names as IDs are unique and less likely to change over time, making them a more reliable choice.", + "configKey": "consents", + "tagKey": "consent", + "placeholder": "e.g: Marketing", + "default": [ + { + "consent": "" + } + ] + } + ] + } + ] + } + } +} diff --git a/test/data/validation/destinations/topsort.json b/test/data/validation/destinations/topsort.json new file mode 100644 index 000000000..a07f0132a --- /dev/null +++ b/test/data/validation/destinations/topsort.json @@ -0,0 +1,197 @@ +[ + { + "testTitle": "With all valid events and details", + "config": { + "apiKey": "test-api", + "topsortEvents": [ + { + "to": "clicks", + "from": "Product Clicked" + }, + { + "to": "impressions", + "from": "Product Viewed" + }, + { + "to": "purchases", + "from": "Order Completed" + } + ], + "connectionMode": { + "web": "cloud" + }, + "consentManagement": {}, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {} + }, + "result": true + }, + { + "testTitle": "With invalid connectionMode value", + "config": { + "apiKey": "test-api", + "topsortEvents": [ + { + "to": "clicks", + "from": "Product Clicked" + }, + { + "to": "impressions", + "from": "Product Viewed" + }, + { + "to": "purchases", + "from": "Order Completed" + } + ], + "connectionMode": { + "web": "abc" + }, + "consentManagement": {}, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {} + }, + "result": false, + "err": ["connectionMode.web must be equal to one of the allowed values"] + }, + { + "testTitle": "Device mode is not supported", + "config": { + "connectionMode": { + "web": "device" + }, + "consentManagement": {}, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {}, + "apiKey": "test-api", + "topsortEvents": [ + { + "to": "clicks", + "from": "Product Clicked" + }, + { + "to": "impressions", + "from": "Product Viewed" + }, + { + "to": "purchases", + "from": "Order Completed" + } + ] + }, + "result": false, + "err": ["connectionMode.web must be equal to one of the allowed values"] + }, + { + "testTitle": "without api key", + "config": { + "connectionMode": { + "web": "cloud" + }, + "consentManagement": {}, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {}, + "topsortEvents": [ + { + "to": "clicks", + "from": "Product Clicked" + }, + { + "to": "impressions", + "from": "Product Viewed" + }, + { + "to": "purchases", + "from": "Order Completed" + } + ] + }, + "result": false, + "err": [" must have required property 'apiKey'"] + }, + { + "testTitle": "Invalid Topsort event name", + "config": { + "connectionMode": { + "web": "cloud" + }, + "consentManagement": {}, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {}, + "apiKey": "test-api", + "topsortEvents": [ + { + "to": "test", + "from": "Product Clicked" + }, + { + "to": "impressions", + "from": "Product Viewed" + } + ] + }, + "result": false, + "err": ["topsortEvents.0.to must be equal to one of the allowed values"] + }, + { + "testTitle": "Invalid Rudderstack event name", + "config": { + "connectionMode": { + "web": "cloud" + }, + "consentManagement": {}, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {}, + "apiKey": "test-api", + "topsortEvents": [ + { + "to": "clicks", + "from": "test" + }, + { + "to": "impressions", + "from": "Product Viewed" + } + ] + }, + "result": false, + "err": ["topsortEvents.0.from must be equal to one of the allowed values"] + }, + { + "testTitle": "With consent management custom provider config and no resolutionStrategy value", + "config": { + "apiKey": "test-api", + "consentManagement": { + "android": [ + { + "provider": "custom" + } + ] + } + }, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {}, + "result": false, + "err": [ + "consentManagement.android.0 must have required property 'resolutionStrategy'", + "consentManagement.android.0 must match \"then\" schema" + ] + }, + { + "testTitle": "With consent management custom provider config invalid provider value", + "config": { + "apiKey": "test-api", + "consentManagement": { + "android": [ + { + "provider": "dummyProvider" + } + ] + }, + "oneTrustCookieCategories": {}, + "ketchConsentPurposes": {} + }, + "result": false, + "err": ["consentManagement.android.0.provider must be equal to one of the allowed values"] + } +] From b5f9e1fc96224b3da86a98ab8b0ed8cb5b833d11 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 13 Dec 2024 09:35:39 +0000 Subject: [PATCH 07/11] chore(release): 1.100.0 --- CHANGELOG.md | 15 +++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7818ad799..029fa90ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. +## [1.100.0](https://github.com/rudderlabs/rudder-config-schema/compare/v1.99.1...v1.100.0) (2024-12-13) + + +### Features + +* add tags for sdk source types ([#1841](https://github.com/rudderlabs/rudder-config-schema/issues/1841)) ([1f4e1c5](https://github.com/rudderlabs/rudder-config-schema/commit/1f4e1c5edb6fb95be21e62d5671427a91a371a50)) +* onboard topsort destination ([#1842](https://github.com/rudderlabs/rudder-config-schema/issues/1842)) ([2c683fe](https://github.com/rudderlabs/rudder-config-schema/commit/2c683fec0ac8d8518096413c6d2b018a1e7b4d1e)) + + +### Bug Fixes + +* pr body in constants pr workflow ([83d7b26](https://github.com/rudderlabs/rudder-config-schema/commit/83d7b2674f2b4bc209331d1dcd2b3c3bacafb4ab)) +* pr body in constants pr workflow ([3d227f7](https://github.com/rudderlabs/rudder-config-schema/commit/3d227f7126c96df9bf64fbd9587ac5d8f19fe17c)) +* pr labels in constants pr workflow ([e8c5167](https://github.com/rudderlabs/rudder-config-schema/commit/e8c5167cad5f9792e2621ddc7695fe85b7aa8fb4)) + ### [1.99.1](https://github.com/rudderlabs/rudder-config-schema/compare/v1.99.0...v1.99.1) (2024-12-12) diff --git a/package-lock.json b/package-lock.json index 471aed4ef..e90a786ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "rudder-config-schema", - "version": "1.99.1", + "version": "1.100.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "rudder-config-schema", - "version": "1.99.1", + "version": "1.100.0", "license": "MIT", "dependencies": { "ajv": "^8.12.0", diff --git a/package.json b/package.json index 9b18ff8b6..ccff979d9 100755 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rudder-config-schema", - "version": "1.99.1", + "version": "1.100.0", "description": "", "main": "src/index.ts", "private": true, From 49356feee94e355e5d1c3f0f83139770eaf12ea4 Mon Sep 17 00:00:00 2001 From: Sudip Paul <67197965+ItsSudip@users.noreply.github.com> Date: Fri, 27 Dec 2024 15:00:51 +0530 Subject: [PATCH 08/11] feat: add config for hash to bingads offline conversions (#1843) --- .../db-config.json | 4 +-- .../bingads_offline_conversions/schema.json | 4 +++ .../ui-config.json | 32 +++++++++++++++++++ .../bingads_offline_conversions.json | 3 ++ 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/configurations/destinations/bingads_offline_conversions/db-config.json b/src/configurations/destinations/bingads_offline_conversions/db-config.json index 084f502a1..432dbde4d 100644 --- a/src/configurations/destinations/bingads_offline_conversions/db-config.json +++ b/src/configurations/destinations/bingads_offline_conversions/db-config.json @@ -20,13 +20,13 @@ "warehouse": ["cloud"] }, "destConfig": { - "defaultConfig": ["rudderAccountId", "customerAccountId", "customerId"], "warehouse": [ "connectionMode", "oneTrustCookieCategories", "ketchConsentPurposes", "consentManagement" - ] + ], + "defaultConfig": ["rudderAccountId", "customerAccountId", "customerId", "isHashRequired"] } }, "options": { diff --git a/src/configurations/destinations/bingads_offline_conversions/schema.json b/src/configurations/destinations/bingads_offline_conversions/schema.json index 7b8b42c51..005b32a91 100644 --- a/src/configurations/destinations/bingads_offline_conversions/schema.json +++ b/src/configurations/destinations/bingads_offline_conversions/schema.json @@ -12,6 +12,10 @@ "type": "string", "pattern": "(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^[0-9]+$" }, + "isHashRequired": { + "type": "boolean", + "default": false + }, "oneTrustCookieCategories": { "type": "object", "properties": { diff --git a/src/configurations/destinations/bingads_offline_conversions/ui-config.json b/src/configurations/destinations/bingads_offline_conversions/ui-config.json index 96da2f9ff..5f8d32d71 100644 --- a/src/configurations/destinations/bingads_offline_conversions/ui-config.json +++ b/src/configurations/destinations/bingads_offline_conversions/ui-config.json @@ -58,6 +58,38 @@ "title": "Configuration settings", "note": "Manage the settings for your destination", "sections": [ + { + "id": "hash", + "title": "Destination settings", + "note": "Configure advanced destination-specific settings here", + "icon": "settings", + "groups": [ + { + "title": "Bing ads offline conversion additional settings", + "fields": [ + { + "type": "checkbox", + "label": "Enable it, if you are not sending hashed data.", + "note": [ + "After enabling this we will send", + { + "text": "hashed email", + "link": "https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#hashedemailaddress" + }, + "and", + { + "text": "hashed phone numbers", + "link": "https://learn.microsoft.com/en-us/advertising/bulk-service/offline-conversion?view=bingads-13#hashedphonenumber" + }, + "to Bingads Offline Conversion." + ], + "configKey": "isHashRequired", + "default": false + } + ] + } + ] + }, { "id": "consentSettings", "title": "Consent settings", diff --git a/test/data/validation/destinations/bingads_offline_conversions.json b/test/data/validation/destinations/bingads_offline_conversions.json index d157e6bde..f677f48df 100644 --- a/test/data/validation/destinations/bingads_offline_conversions.json +++ b/test/data/validation/destinations/bingads_offline_conversions.json @@ -182,6 +182,7 @@ "config": { "customerAccountId": "434342324", "customerId": "447477473", + "isHashRequired": "true", "oneTrustCookieCategories": { "warehouse": [ { @@ -205,6 +206,7 @@ }, "result": false, "err": [ + "isHashRequired must be boolean", "oneTrustCookieCategories.warehouse.0.oneTrustCookieCategory must match pattern \"(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$\"", "ketchConsentPurposes.warehouse.0.purpose must match pattern \"(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$\"" ] @@ -213,6 +215,7 @@ "config": { "customerAccountId": "434342324", "customerId": "447477473", + "isHashRequired": true, "oneTrustCookieCategories": { "warehouse": [ { From 04797e99f87200d550b39016812cab0969a8f5ce Mon Sep 17 00:00:00 2001 From: Sandeep Digumarty Date: Fri, 27 Dec 2024 18:05:07 +0530 Subject: [PATCH 09/11] feat(http): added pathParams field and renamed the tab ro URL params (#1831) --- .../destinations/http/db-config.json | 1 + .../destinations/http/schema.json | 22 +++- .../destinations/http/ui-config.json | 28 ++++- test/data/validation/destinations/http.json | 118 ++++++++++++++++++ 4 files changed, 158 insertions(+), 11 deletions(-) diff --git a/src/configurations/destinations/http/db-config.json b/src/configurations/destinations/http/db-config.json index 843920caa..aeed36063 100644 --- a/src/configurations/destinations/http/db-config.json +++ b/src/configurations/destinations/http/db-config.json @@ -45,6 +45,7 @@ "propertiesMapping", "queryParams", "headers", + "pathParams", "isBatchingEnabled", "maxBatchSize", "blacklistedEvents", diff --git a/src/configurations/destinations/http/schema.json b/src/configurations/destinations/http/schema.json index 706b28362..c1b9a4f4b 100644 --- a/src/configurations/destinations/http/schema.json +++ b/src/configurations/destinations/http/schema.json @@ -38,7 +38,19 @@ }, "from": { "type": "string", - "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" + "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" + } + } + } + }, + "pathParams": { + "type": "array", + "items": { + "type": "object", + "properties": { + "path": { + "type": "string", + "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" } } } @@ -50,11 +62,11 @@ "properties": { "to": { "type": "string", - "pattern": "^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" + "pattern": "^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" }, "from": { "type": "string", - "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" + "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" } } } @@ -66,11 +78,11 @@ "properties": { "to": { "type": "string", - "pattern": "^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" + "pattern": "^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" }, "from": { "type": "string", - "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" + "pattern": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$" } } } diff --git a/src/configurations/destinations/http/ui-config.json b/src/configurations/destinations/http/ui-config.json index 8148ce3b0..990defd5a 100644 --- a/src/configurations/destinations/http/ui-config.json +++ b/src/configurations/destinations/http/ui-config.json @@ -481,7 +481,7 @@ "type": "textInput", "key": "from", "label": "Value", - "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", + "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", "regexErrorMessage": "Please enter a valid JSON path or a constant", "placeholder": "e.g: $.properties.key1" } @@ -490,8 +490,24 @@ ] }, { - "name": "Query Parameters", + "name": "Request URL", "fields": [ + { + "type": "mapping", + "label": "Enter your path parameters in sequence", + "columns": [ + { + "key": "path", + "type": "textInput", + "label": "Path", + "placeholder": "$.userId or users", + "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", + "regexErrorMessage": "Please enter a valid JSON path or a constant" + } + ], + "default": [], + "configKey": "pathParams" + }, { "type": "mapping", "label": "Map your query parameters", @@ -503,7 +519,7 @@ "type": "textInput", "key": "to", "label": "Key", - "regex": "^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", + "regex": "^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", "regexErrorMessage": "JSON path is not supported. Please enter a constant", "placeholder": "e.g: customerId" }, @@ -511,7 +527,7 @@ "type": "textInput", "key": "from", "label": "Value", - "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", + "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", "regexErrorMessage": "Please enter a valid JSON path or a constant", "placeholder": "e.g: $.userId or userId" } @@ -533,7 +549,7 @@ "type": "textInput", "key": "to", "label": "Key", - "regex": "^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", + "regex": "^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", "regexErrorMessage": "JSON path is not supported. Please enter a constant", "placeholder": "e.g. content-type" }, @@ -541,7 +557,7 @@ "type": "textInput", "key": "from", "label": "Value", - "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", + "regex": "^\\$(?:\\.|(\\.(\\w+|\\*)|\\[\\d+\\]|\\[('\\w+'|\"\\w+\")\\]|\\[\\*\\]|\\.\\w+\\(\\))*)$|^(?!\\$)[A-Za-z0-9!#$%&'*+.^_`|~-]{1,100}$", "regexErrorMessage": "Please enter a valid JSON path or a constant", "placeholder": "e.g. application/json" } diff --git a/test/data/validation/destinations/http.json b/test/data/validation/destinations/http.json index 0c299d1d0..5d933acd2 100644 --- a/test/data/validation/destinations/http.json +++ b/test/data/validation/destinations/http.json @@ -577,5 +577,123 @@ "ketchConsentPurposes.web must be array", "ketchConsentPurposes.unity.0 must be object" ] + }, + { + "testTitle": "With pathParams", + "config": { + "apiUrl": "http://sample.com/api/hooks/{{$.traits.userId}}/url/{{$.properties.event}}", + "auth": "basicAuth", + "username": "test-user", + "password": "", + "method": "POST", + "format": "JSON", + "http-connectionMode": "cloud", + "connectionMode": { + "cloud": "cloud" + }, + "consentManagement": {}, + "isBatchingEnabled": true, + "maxBatchSize": "10", + "headers": [ + { + "from": "$.h1", + "to": "'val1'" + }, + { + "from": "$.h2", + "to": "2" + }, + { + "to": "testProp", + "from": "$.properties.testProp" + } + ], + "queryParams": [ + { + "from": "$.q1", + "to": "'val1'" + } + ], + "propertiesMapping": [ + { + "from": "$.properties.key1", + "to": "$.events.key2" + } + ], + "pathParams": [ + { + "path": "$.properties.key1" + } + ], + "oneTrustCookieCategories": { + "android": [ + { + "oneTrustCookieCategory": "more than 100 characters string - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + { + "oneTrustCookieCategory": "C0004" + } + ], + "ios": [ + { + "oneTrustCookieCategory": { + "not": "a string" + } + }, + { + "oneTrustCookieCategory": "C0004" + } + ], + "web": { + "not": "an array" + }, + "unity": [ + "not an object", + { + "oneTrustCookieCategory": "C0004" + } + ] + }, + "ketchConsentPurposes": { + "android": [ + { + "purpose": "more than 100 characters string - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + { + "purpose": "P4" + } + ], + "ios": [ + { + "purpose": { + "not": "a string" + } + }, + { + "purpose": "P4" + } + ], + "web": { + "not": "an array" + }, + "unity": [ + "not an object", + { + "purpose": "P4" + } + ] + } + }, + "result": false, + "err": [ + "oneTrustCookieCategories.android.0.oneTrustCookieCategory must match pattern \"(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$\"", + "oneTrustCookieCategories.ios.0.oneTrustCookieCategory must be string", + "oneTrustCookieCategories.web must be array", + "oneTrustCookieCategories.unity.0 must be object", + "ketchConsentPurposes.android.0.purpose must match pattern \"(^\\{\\{.*\\|\\|(.*)\\}\\}$)|(^env[.].+)|^(.{0,100})$\"", + "ketchConsentPurposes.ios.0.purpose must be string", + "ketchConsentPurposes.web must be array", + "ketchConsentPurposes.unity.0 must be object" + ] } ] From 5b1bd34551e858ae832ffa90db1ede7b57856dcf Mon Sep 17 00:00:00 2001 From: Aris Plakias Date: Thu, 2 Jan 2025 09:11:29 +0200 Subject: [PATCH 10/11] chore(wht): remove unused wht definitions (#1852) --- scripts/deployToDB.py | 4 +-- .../libres360_base_features/db-config.json | 27 ------------------- .../db-config.json | 23 ---------------- .../libres360_shopify_features/db-config.json | 23 ---------------- .../libres360_stripe_features/db-config.json | 23 ---------------- 5 files changed, 2 insertions(+), 98 deletions(-) delete mode 100644 src/configurations/wht-lib-projects/libres360_base_features/db-config.json delete mode 100644 src/configurations/wht-lib-projects/libres360_ecommerce_features/db-config.json delete mode 100644 src/configurations/wht-lib-projects/libres360_shopify_features/db-config.json delete mode 100644 src/configurations/wht-lib-projects/libres360_stripe_features/db-config.json diff --git a/scripts/deployToDB.py b/scripts/deployToDB.py index b2f1f37bb..067aea6e5 100644 --- a/scripts/deployToDB.py +++ b/scripts/deployToDB.py @@ -8,7 +8,7 @@ from constants import CONFIG_DIR -ALL_SELECTORS = ["destination", "source", "wht-lib-project"] +ALL_SELECTORS = ["destination", "source"] def get_command_line_arguments(): @@ -19,7 +19,7 @@ def get_command_line_arguments(): parser.add_argument( "selector", nargs="?", - help="Specify destination, source or wht-lib-project", + help="Specify destination or source", default=None, ) parser.add_argument( diff --git a/src/configurations/wht-lib-projects/libres360_base_features/db-config.json b/src/configurations/wht-lib-projects/libres360_base_features/db-config.json deleted file mode 100644 index f59fc5b47..000000000 --- a/src/configurations/wht-lib-projects/libres360_base_features/db-config.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "base_features", - "githubRepoURL": "https://github.com/rudderlabs/profiles-multieventstream-features", - "description": "base features", - "config": { - "sourcesSupported": [ - { - "name": ".*", - "category": "webhook|null" - } - ], - "destinationsSupported": [ - { - "name": "rs", - "accountRole": "redshift" - }, - { - "name": "snowflake", - "accountRole": "snowflake" - }, - { - "name": "deltalake", - "accountRole": "databricks" - } - ] - } -} diff --git a/src/configurations/wht-lib-projects/libres360_ecommerce_features/db-config.json b/src/configurations/wht-lib-projects/libres360_ecommerce_features/db-config.json deleted file mode 100644 index eedcfebde..000000000 --- a/src/configurations/wht-lib-projects/libres360_ecommerce_features/db-config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "ecommerce_features", - "githubRepoURL": "git@github.com:rudderlabs/profiles-ecommerce-features.git", - "description": "ecommerce features", - "config": { - "sourcesSupported": [ - { - "name": ".*", - "category": "webhook|null" - } - ], - "destinationsSupported": [ - { - "name": "rs", - "accountRole": "redshift" - }, - { - "name": "snowflake", - "accountRole": "snowflake" - } - ] - } -} diff --git a/src/configurations/wht-lib-projects/libres360_shopify_features/db-config.json b/src/configurations/wht-lib-projects/libres360_shopify_features/db-config.json deleted file mode 100644 index be8210872..000000000 --- a/src/configurations/wht-lib-projects/libres360_shopify_features/db-config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "shopify_features", - "githubRepoURL": "git@github.com:rudderlabs/profiles-shopify-features.git", - "description": "shopify features", - "config": { - "sourcesSupported": [ - { - "name": "shopify", - "category": "webhook" - } - ], - "destinationsSupported": [ - { - "name": "rs", - "accountRole": "redshift" - }, - { - "name": "snowflake", - "accountRole": "snowflake" - } - ] - } -} diff --git a/src/configurations/wht-lib-projects/libres360_stripe_features/db-config.json b/src/configurations/wht-lib-projects/libres360_stripe_features/db-config.json deleted file mode 100644 index 347c5c40b..000000000 --- a/src/configurations/wht-lib-projects/libres360_stripe_features/db-config.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "name": "stripe_features", - "githubRepoURL": "git@github.com:rudderlabs/profiles-stripe-features.git", - "description": "stripe features", - "config": { - "sourcesSupported": [ - { - "name": "singer-stripe", - "category": "singer-protocol" - } - ], - "destinationsSupported": [ - { - "name": "rs", - "accountRole": "redshift" - }, - { - "name": "snowflake", - "accountRole": "snowflake" - } - ] - } -} From ac0f8674eb860ebc3bf2e2f75aa736066ad9b385 Mon Sep 17 00:00:00 2001 From: Sai Kumar Battinoju <88789928+saikumarrs@users.noreply.github.com> Date: Mon, 6 Jan 2025 15:08:31 +0530 Subject: [PATCH 11/11] fix: javascript source display name (#1854) --- src/configurations/sources/javascript/db-config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configurations/sources/javascript/db-config.json b/src/configurations/sources/javascript/db-config.json index 4f0773d72..5103b01df 100644 --- a/src/configurations/sources/javascript/db-config.json +++ b/src/configurations/sources/javascript/db-config.json @@ -1,6 +1,6 @@ { "name": "Javascript", - "displayName": "Javascript", + "displayName": "JavaScript", "type": "web", "options": { "sdkExecutionEnvironment": "client"